有 Java 编程相关的问题?

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

java如何在运行时替换类?

我有两门课。我想替换一个类A,这样它的任何实例实际上都会像类B一样工作

class A {
    fun test() = "a"
}

class B { 
    fun test() = "b"
}

我试图使用ClassLoader来实现这一点,但我无法让系统调用MyClassLoader

class MyClassLoader() : ClassLoader() {

    @Throws(ClassNotFoundException::class)
    override fun loadClass(name: String): Class<*>? {
        if (name == "com.myapp.A") {
            return B::class.java
        } else return super.loadClass(name)
    }
}

这必须在编译时或运行时发生,因为我无法手动将A的每个实例替换为B。(这是这个问题的一个极简主义例子)A无法删除,这是一项要求

那么,我如何附加MyClassLoader以便系统使用它呢

我试过:Thread.currentThread().setContextClassLoader(MyClassLoader())但是MyClassLoader没有被调用


共 (2) 个答案

  1. # 1 楼答案

    可以使用工厂设计模式。根据需要的类实例类型,可以在运行时从Factory类静态方法加载/返回它

  2. # 2 楼答案

    我不知道它将用于什么,但对于低规模,您可以尝试只在包含两个类的方法和属性的对象上使用 比如

    val classType2 = 1
    class AB{
        fun testA() = "a"
        fun testB() = "b"
        val classType1 = 1 
    
       fun test() {
         if(classType1 ==1){testA()}
         else{testB()}    
       }
    
    }
    

    你可以通过改变课程类型来增加乐趣

    如果要在同一时间更改所有实例,请在if contion将classType1替换为classType2,然后更改classType2的值

    我希望