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
没有被调用
# 1 楼答案
可以使用工厂设计模式。根据需要的类实例类型,可以在运行时从Factory类静态方法加载/返回它
# 2 楼答案
我不知道它将用于什么,但对于低规模,您可以尝试只在包含两个类的方法和属性的对象上使用 比如
你可以通过改变课程类型来增加乐趣
如果要在同一时间更改所有实例,请在if contion将classType1替换为classType2,然后更改classType2的值
我希望