JAVA是否有可能动态地让一个类扩展另一个?

时间:2017-03-07 13:58:35

标签: java

我从昨天起就一直在寻找一种方法来做到这一点。我所拥有的是来自第三方的数百个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在需要时扩展我的代码。

  • 需要为POJO for UPDATE生成json架构
  • 需要验证他们的json是否符合POJO UPDATE的要求
  • 需要将他们的json转换为更新的POJO

此外,

  • 需要为POJO for CREATE生成json架构
  • 需要验证他们的json符合CREATE的POJO要求
  • 需要将他们的json转换为POJO for CREATE

使用Jackson Mixin和ObjectMapper我可以在创建模式时动态地将我的代码应用到类中,但我遇到的问题是当试图让POJO扩展Mixin不会解决的类时问题。

4 个答案:

答案 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。这允许您动态地更改策略。