我有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
。
我不知道它将用于什么,但是对于小规模,您可以尝试只在包含两个类的方法和属性的对象上使用像例子
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的值。
我希望
您可以使用Factory设计模式。根据所需的类实例,可以在运行时从Factory类静态方法加载/返回它。