如何在运行时替换类?

问题描述 投票:0回答:2

我有2个班级。我想替换一个类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

java android kotlin
2个回答
-1
投票

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

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

   fun test() {
     if(classType1 ==1){testA()}
     else{testB()}    
   }

}

您可以添加乐趣来更改类类型,或

如果要同时更改所有实例,则在有条件时将classType1替换为classType2,然后更改classType2的值。

我希望


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.