Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA是否可以动态地让一个类扩展另一个类?_Java - Fatal编程技术网

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

JAVA是否可以动态地让一个类扩展另一个类?,java,Java,从昨天开始我就一直在寻找一种方法来做到这一点。我拥有数百个来自第三方的POJO,需要根据业务规则对其应用属性。我避免修改POJO,因为第三方可能会重新创建POJO,从而给以后的文件管理带来噩梦 我试图做的是动态地让一个类扩展另一个类。 比如说 POJO:Foo.java package abc.service; public class Bar { private String claim = ""; public Bar(){ claim = "You're

从昨天开始我就一直在寻找一种方法来做到这一点。我拥有数百个来自第三方的POJO,需要根据业务规则对其应用属性。我避免修改POJO,因为第三方可能会重新创建POJO,从而给以后的文件管理带来噩梦

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

POJO:Foo.java

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
extend
Foo
,你就完成了。@ThomasJungblut大多数情况下,它们是通过魔法(和动态代理,我不认为OP指的是动态代理)工作的