目前正在研究一种允许对使用 Prevayler 库序列化的对象进行反序列化的机制。例如:
我有旧的 .jar 和类:
class A {
public B b;
public B getB() {
return b;
}
}
class B {
public int c;
public int getC() {
return c;
}
}
现在我需要某种迁移,因为类“B”中的“c”需要转换为字符串。
我使用自定义类加载器来加载类和方法:
// 1. make List of URLs to pass to CustomClassLoader class
URL url = new URL(PATH_TO_JAR);
List<URL> urls = new ArrayList<URL>();
urls.add(url);
// 2. Use CustomLoaderClass, to make sure, that loaded classes/methods are not from current project,
// but from the jar specified in URL, since Java class loaders (including URLClassLoader)
// first ask to load classes from their parent class loader.
CustomClassLoader clsLoader = new CustomClassLoader(urls);
java.lang.Class cls = clsLoader.loadClass("A");
// String.class in methods second parametr means, that we should pass String to that method
Method method = cls.getMethod("getB");
// 3. invoke method which returns Object instead "B"
Object obj = method.invoke(null);
我对 B 类也做过类似的事情。 如何将 Object obj 转换为“B”,以便可以从类 B 调用方法 getC?
最佳答案
您将无法动态指定赋值运算符左侧的类型。至少我知道没有办法做到这一点。您需要首先检查它是否为 B 类型,然后将其显式转换为 B。请记住,obj 变量的类型为 Object,但它引用的对象是 B,因此 getClass() 应该返回 B。当您调用该方法时,Object 类型的 obj 参数是您要调用该方法的对象。如果相关方法是静态的,则它只能为 null。否则,您将需要指定您希望在 A 类的哪个实例上调用该方法。
关于java - 使用自定义类加载器将类转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251111/