2017-03-07 188 views
2

从昨天开始,我一直在寻找一种方法来做到这一点。我拥有的是来自第三方的数百个POJO,并且需要根据业务规则对这些POJO应用属性。我正在避免改变POJO,因为第三方可能会重新创建它们,因此造成管理文件的恶梦。JAVA是否可以动态地让一个类扩展另一个类?

我试图做的是动态地让一个类扩展另一个类。例如, 。

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在需要时扩展我的代码的原因。

  • 需要生成POJO的用于UPDATE
  • 需要验证自己的JSON JSON模式符合UPDATE
  • POJO的要求,需要他们的JSON转换成的POJO的UPDATE

而且,

  • 需要为CREATE生成POJO的json模式
  • 需要核实他们的JSON符合POJO的要求制造
  • 需要把他们的JSON转换成POJO的用于创建

使用杰克逊密新和ObjectMapper我能到我的代码中动态适用于类当创建模式时,我遇到的问题是当试图让POJO扩展Mixin不会解决问题的类时。

+1

否(我必须键入至少13个字符,所以)... –

+0

号使用接口或抽象类试过吗? –

+0

@EngineerDollery我当然希望它是可能的,否则嘲笑框架将无法正常工作;-) –

回答

1

这是不可能的。

简而言之,JAVA目前(至最新版本)没有规定在运行时动态扩展类并加载到JVM。

5

用普通的Java:不,它不能完成。

您可以在构建过程中或运行时更改字节码。但是很难,而且没有很多文档。

AspectJ的declare parents表达式可能是构建时最简单的方法。

如果您想在运行时执行此操作,请查看asm,CGLib或ByteBuddy等框架。但是您将不得不从自定义的ClassLoader或代理中运行代码。

0

而不是扩展,你应该使用设计模式。例如Stategy Pattern。这可以让你改变你的策略动态。

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()); 
} 
相关问题