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

标签 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”需要转换为字符串。

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

    // 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 类的哪个实例上调用该方法。

请参阅此处的调用文档:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,%20java.lang.Object...)

关于java - 使用自定义类加载器将类转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251111/

相关文章:

java - 如何删除 <ref> 和 </ref> 之间的文本

java - jSoup 从 img 标签获取标题

c# - 如果在运行时只知道类型参数,如何调用泛型方法?

c# - 如何排除父类的属性

java - 从 Optional<> 转换为 ArrayList<>

java - 如何定义实现两个接口(interface)的泛型类?

java - 访问父类(super class)对象 vector 中的子类方法

c# - 使用反射将 lambda 表达式作为参数传递

c++ - C++ 中的多态性和类型转换

java - 扩展父类(super class)和 ClassCastException