我从昨天起就一直在寻找一种方法来做到这一点。我所拥有的是来自第三方的数百个POJO,需要根据业务规则将属性应用于这些POJO。我正在避免改变POJO,因为第三方可能会重新创建它们,从而造成管理文件的噩梦。
我正在尝试做的是动态地让一个类扩展另一个类。 例如。
POJO:Foo.java
package abc.service;
public class Foo {
private String greeting = "";
public Foo(){
gretting = "Good morning";
}
public String getGreeting(){
return greeting;
}
}
// end file
我的:Bar.java
package abc.service;
public class Bar {
private String claim = "";
public Bar(){
claim = "You're correct";
}
public String getClaim(){
return claim;
}
}
// end file
我的:TestMe.java
在与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());
}
此外,正在发生的是从提供的POJO创建JSON模式。但POJO仅基于UPDATE记录方案。我正在寻找让POJO为CREATE记录场景扩展另一个类的最佳方法,这就是为什么我希望动态地让他们的POJO在需要时扩展我的代码。
此外,
使用Jackson Mixin和ObjectMapper我可以在创建模式时动态地将我的代码应用到类中,但我遇到的问题是当试图让POJO扩展Mixin不会解决的类时问题。
答案 0 :(得分:5)
使用普通Java:不,它无法完成。
您可以在构建过程中或在运行时更改字节代码。但这很难,并且没有很多文档。
AspectJ的declare parents
表达式可能是构建时最简单的方法。
如果您想在运行时执行此操作,请查看asm,CGLib或ByteBuddy等框架。但是您必须从自定义的ClassLoader或代理程序中运行代码。
答案 1 :(得分:4)
您可以使用合成而不是继承。
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 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.getGreeting());
// Trying to call the Bar method
System.out.println(bar.getClaim());
}
答案 2 :(得分:1)
这是不可能的。
简而言之,JAVA目前(直到最新版本)没有在运行时动态扩展类并加载到JVM的规定。
答案 3 :(得分:0)
您应该使用设计模式,而不是扩展。例如Stategy Pattern。这允许您动态地更改策略。