JAVA是否可以动态地让一个类扩展另一个类?
从昨天开始我就一直在寻找一种方法来做到这一点。我拥有数百个来自第三方的POJO,需要根据业务规则对其应用属性。我避免修改POJO,因为第三方可能会重新创建POJO,从而给以后的文件管理带来噩梦 我试图做的是动态地让一个类扩展另一个类。 比如说 POJO:Foo.javaJAVA是否可以动态地让一个类扩展另一个类?,java,Java,从昨天开始我就一直在寻找一种方法来做到这一点。我拥有数百个来自第三方的POJO,需要根据业务规则对其应用属性。我避免修改POJO,因为第三方可能会重新创建POJO,从而给以后的文件管理带来噩梦 我试图做的是动态地让一个类扩展另一个类。 比如说 POJO:Foo.java package abc.service; public class Bar { private String claim = ""; public Bar(){ claim = "You're
package abc.service;
public class Bar {
private String claim = "";
public Bar(){
claim = "You're correct";
}
public String getClaim(){
return claim;
}
}
// end file
Mine:Bar.java
package abc.service;
public class Bar {
private String claim = "";
public Bar(){
claim = "You're correct";
}
public String getClaim(){
return claim;
}
}
// end file
Mine:TestMe.java
package abc.service;
public class Bar {
private String claim = "";
public Bar(){
claim = "You're correct";
}
public String getClaim(){
return claim;
}
}
// end file
尝试在一个独立于POJO的类中,让一个POJO扩展我的另一个类
这超出了JAVA的能力吗
package abc;
public class TestMe {
Foo f = new Foo();
Class c1 = f.getClass();
Bar b = new Bar();
Class c2 = b.getClass();
Class merged = c2.asSubclass(c1);
// Trying to call the Foo method
System.out.println(merged.getGreeting());
// Trying to call the Bar method
System.out.println(merged.getClaim());
}
此外,JSON模式是从提供的POJO创建的。但POJO仅基于更新记录场景。我正在寻找让POJO为创建记录场景扩展另一个类的最佳方法,这就是为什么我希望在需要时动态地让他们的POJO扩展我的代码
- 需要为POJO生成json模式以进行更新
- 需要验证他们的json是否满足更新的POJO要求
- 需要将他们的json转换为POJO进行更新
- 需要为创建的POJO生成json模式
- 需要验证他们的json是否满足创建的POJO要求
- 需要将其json转换为POJO以创建
使用Jackson Mixin和ObjectMapper,我可以在创建模式时将代码动态应用于类,但我遇到的问题是,在Mixin无法解决问题的情况下,尝试让POJO扩展类。这是不可能的。
简单地说,JAVA目前(直到最新版本)没有在运行时动态扩展类并加载到JVM的规定。普通JAVA:不,这是不可能的 您可以在构建过程中或运行时更改字节码。但这很难,而且没有太多的文档 AspectJ的
declare parents
表达式可能是在构建时执行此操作的最简单方法
如果您想在运行时执行此操作,请查看asm、CGLib或ByteBuddy等框架。但是您必须从自定义类加载器或代理内部运行代码。您应该使用设计模式,而不是扩展。例如,。这允许您动态更改策略。您可以使用组合而不是继承
public class Foo {
private String greeting = "";
public Foo(){
gretting = "Good morning";
}
public String getGreeting(){
return greeting;
}
}
你们班
public class Bar {
private String claim = "";
private Foo foo;
public Bar(){
claim = "You're correct";
foo = new Foo();
}
public String getClaim(){
return claim;
}
public Foo getFoo(){
return foo;
}
}
测试呢
public class TestMe {
// Trying to call the Foo method
System.out.println(bar.getFoo().getGreeting());
// Trying to call the Bar method
System.out.println(bar.getClaim());
}
public class TestMe {
// Trying to call the Foo method
System.out.println(bar.getGreeting());
// Trying to call the Bar method
System.out.println(bar.getClaim());
}
或者你可以把你的课改一点
public class Bar {
private String claim = "";
private Foo foo;
public Bar(){
claim = "You're correct";
foo = new Foo();
}
public String getClaim(){
return claim;
}
public String getGreeting(){
return foo.getGreeting();
}
}
测试呢
public class TestMe {
// Trying to call the Foo method
System.out.println(bar.getFoo().getGreeting());
// Trying to call the Bar method
System.out.println(bar.getClaim());
}
public class TestMe {
// Trying to call the Foo method
System.out.println(bar.getGreeting());
// Trying to call the Bar method
System.out.println(bar.getClaim());
}
没有(而且我必须至少输入13个字符,所以)。。。没有。尝试过使用接口或抽象类吗?@EngineerDollery我当然希望这是可能的,否则模拟框架将无法工作;-)我不明白为什么需要动态扩展第三方POJO。为什么常见的静态继承在这里不适用?只要做
Bar
extendFoo
,你就完成了。@ThomasJungblut大多数情况下,它们是通过魔法(和动态代理,我不认为OP指的是动态代理)工作的