有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用反射更改java类超类

是否可以在运行时使用反射更改类对象的继承层次结构

我的情况是:

超类

中产阶级扩展了超阶级

BottomClass扩展了超类

我想在运行时使用反射来更改BottomClass以扩展MiddleClass。这可能吗

谢谢


共 (4) 个答案

  1. # 1 楼答案

    继承是静态的,因此不能在运行时更改

    但是,您可以将SuperClass作为接口,或者使用委托而不是继承

  2. # 2 楼答案

    使用Java最接近这个目标的是instrumentation。基本上,您编写一些Java类,这些类被赋予定义类的一系列字节,然后处理字节码,返回修改过的类文件字节数组。然后将这些类打包到一个JAR文件中,并告诉JVM使用它们,可以在命令行上使用,也可以通过将一个属性放入检测JAR文件的清单文件中

    当然,如果你这样做,你会想使用一些字节码操作库,比如ASM

    编辑:如果你感兴趣的类实现了接口,你可能想通过java.lang.reflect.Proxy查看一下dynamic proxy classes。这样做的缺点是,您没有编写的代码片段不受影响,但有以下优点:

    1. 比修改类的字节码容易得多
    2. 您可以动态选择使代理的不同实例表现为具有不同的超类
    3. 你不必担心任何问题
  3. # 3 楼答案

    这是不可能的。例如,如果您已经有一个BottomClass对象,并且您正试图更改super class,那么该对象会发生什么情况?不可能

  4. # 4 楼答案

    不,通过反射是不可能的,因为反射是用来分析现有代码的,而不是用来修改它