在IDEA中,使Java类比库中的类具有更高的编译优先级
我们将部分功能打包在外部库中,并将其附加到我们的项目中。那个图书馆不能以任何方式改变。其中包括两个类:在IDEA中,使Java类比库中的类具有更高的编译优先级,java,intellij-idea,extends,Java,Intellij Idea,Extends,我们将部分功能打包在外部库中,并将其附加到我们的项目中。那个图书馆不能以任何方式改变。其中包括两个类:com.myorg.pagrand和com.myorg.Dad扩展了com.myorg.pagrand。还有com.myorg.Grandson扩展com.myorg.Dad和库外的一些其他类扩展com.myorg.grands 我反编译com.myorg.pagrand类并向其中添加一个新方法new\u method()。 然后我尝试在com.myorg.Grandson中使用new\u me
com.myorg.pagrand
和com.myorg.Dad
扩展了com.myorg.pagrand
。还有com.myorg.Grandson
扩展com.myorg.Dad
和库外的一些其他类扩展com.myorg.grands
我反编译com.myorg.pagrand
类并向其中添加一个新方法new\u method()
。
然后我尝试在com.myorg.Grandson
中使用new\u method()
,但IDEA不允许我这样做,因为Grandson扩展了Dad,它扩展了库中不包含new\u method()的爷爷。
我试图将爷爷从库中删除,但令人惊讶的是,IDEA一句话也没说,并且成功地编译了一个项目,尽管在库的边界内,Dad扩展了不存在的类
问题是如何强制Dad在不删除库中的新类的情况下扩展新类?事实上,您正在复制具有完整包签名的类,因此您将获得类加载器首先加载的类。我知道在Websphere中您可以调整类加载器优先级,但在您的情况下不能这样说
不管怎样,为什么不直接进行反编译呢?通过反编译/定制,您正在导致自己与外部库和不良做法(可能是版权问题)的硬耦合。此外,如果库得到更新,您将遇到重构自定义类的麻烦
选项:
创建自己的实现,例如:
创建一个接口,该接口可以复制内存中的所有方法以及所需的方法
扩展类并从接口实现添加的方法,所有其他方法将保持不变
从您自己的类层次结构扩展所有其他扩展类
使用接口作为命名,而不是使用库公共类
通过这种方式,您可以创建自己的库接口,如果它发生更改,您就知道在哪里进行更改
你甚至可以在没有界面的情况下完成,这是一种包装功能,这取决于你需要实现什么
无论如何,我会尝试用自己的代码来解决这个问题,而不是弄乱库。做这样的把戏是不值得的。如果一个新的程序员接受了这个项目,他们将需要大量的时间来找出它的行为原因和方式
现在,类层次结构的结构可能会有所不同,但这取决于您需要的具体实现,因此如果您希望得到更具体的答案,那么您必须发布关于库是什么以及您试图添加什么的更详细数据
关于它必须首先出现在类加载器中
如果IDEA在您的项目中,应该首先加载您的类。您还可以尝试为类创建单独的库,并将其包含在项目中
另请参见:您可以
- 在
Dad
和GrandSon
之间添加一个抽象类:扩展Dad
,并在子类中添加您的方法。然后从该子类派生出GrandSon
- 将
Dad
的一个实例放入一个新类中,并让IDE为聚合的Dad
实例创建委托方法。再次将新方法添加到新类中
还有一种可能性:
- 如果必须就地修改类,请使用
aspectj
编入代码:aspectj在运行时更改字节码(不需要源代码)。这样可以添加方法或字段
OT:您的型号似乎有点奇怪。爸爸是爷爷,孙子是爸爸。这真的是你的意图吗?