目前正在开发一种机制,该机制允许对使用Prevayler库序列化的对象进行反序列化。例如:
我有一个旧的.jar类:
class A {
public B b;
public B getB() {
return b;
}
}
class B {
public int c;
public int getC() {
return c;
}
}
现在我需要某种迁移,因为类"B"中的"c"需要被强制转换为String。
我使用自定义classloader来加载类和方法:
// 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也做了类似的处理。我如何可以将对象obj转换为"B",这样我就可以从类B调用方法getC ?
不能动态地指定赋值操作符左侧的类型。至少我不知道有什么办法。您需要首先检查它是否是B类型,然后显式地将其强制转换为B。记住,obj变量是Object类型,但它引用的对象是B,因此getClass()应该返回B。当您调用该方法时,Object类型的obj参数是您想要调用该方法的对象。如果所讨论的方法是静态的,它只能为null。否则,您需要指定希望在类A的哪个实例上调用该方法。
请参阅此处的调用文档:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,%20java.lang.Object…)