Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类加载器:如何替换3pp类的方法_Java_Classloader - Fatal编程技术网

Java类加载器:如何替换3pp类的方法

Java类加载器:如何替换3pp类的方法,java,classloader,Java,Classloader,我尝试替换3pp类中的一个方法,该方法由另一个3pp类调用。 我知道是否重写了hole类,并修改了类路径顺序;或者将其放入java home的lib/ext中,扩展类加载器将加载my类而不是原始类 但是如何从替换类扩展原始类: package com.example public class Foo extends com.example.Foo { @Override public void m1() { } } 我知道这个示例不起作用,但我试图描述目标:这个类使用相

我尝试替换3pp类中的一个方法,该方法由另一个3pp类调用。 我知道是否重写了hole类,并修改了类路径顺序;或者将其放入java home的lib/ext中,扩展类加载器将加载my类而不是原始类

但是如何从替换类扩展原始类:

package com.example
public class Foo extends com.example.Foo {
    @Override
    public void m1() {
    }
}
我知道这个示例不起作用,但我试图描述目标:这个类使用相同的规范名称扩展原始类,一个方法被重写,所有其他方法被继承。因此,如果我们增加3pp产品的版本,我们不需要修改我们的类,因为我们只覆盖我们想要覆盖的方法


有人有好的解决方案或好主意吗?

你在做什么是一件非常困难的事情,如果你在一个web应用程序上工作,如果你试图扩展的类在库中使用,它将不起作用,因为如果你的JAR中有一个使用Foo类的类SomeService,那么类加载器将在JAR中加载该类。
另一个问题是,用这种方法重写类不是很好,我建议使用AOP重写该方法。
如果您使用的是spring,它有一个强大的系统来完成,但它只在spring上下文中工作。
否则,您可以使用AspectJ(老实说,我从未使用过它)


最后一件事,这个类只是在3pp库中使用的吗?

什么是3pp类?你的意思是什么?是的,它仅在3pp lib.mmm中使用。如果你试图使用相同的名称和包编写一个类,你必须编写整个类,你不能只扩展相同的类(因为类加载器将扩展相同的类,这是不可能的)。我唯一的建议是使用AspectJ拦截方法调用,而不是使用自己的方法调用