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

时间:2014-06-16 19:50:18

标签: java reflection casting classloader

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

我正在使用自定义类加载器来加载类和方法:

    // 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?

1 个答案:

答案 0 :(得分:1)

您无法动态指定赋值运算符左侧的类型。至少我知道没办法那样做。您需要首先检查它是否为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...)