在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:您的型号似乎有点奇怪。爸爸是爷爷,孙子是爸爸。这真的是你的意图吗?