使用自定义类加载器将类强制转换为对象



目前正在开发一种机制,该机制允许对使用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…)

相关内容

  • 没有找到相关文章

最新更新