java - 使用字节数组中的类而不进行反射?

标签 java reflection classloader

我已经使用 ASM 检测了我的类并像这样处理它

public class MyClassLoader extends ClassLoader {
...
    byte[] classBytes = ... //the class is of type com.mypackage.Test
    Class clazz = defineClass("com.mypackage.Test", classBytes, 0, classBytes.length);
    resolveClass(clazz);
    com.mypackage.Test test =(com.mypackage.Test) clazz.newInstance();

但是我在最后一行得到 ClassCastException:

java.lang.ClassCastException: com.mypackage.Test cannot be cast to com.mypackage.Test

解决方法是使用反射:

Object test = clazz.newInstance();
test.getClass().getMethods()[0].invoke(test, null); //invoke some method - successfully

我是否使用了错误的类加载器或其他东西?

最佳答案

Class.newInstance 是一个反射调用。

在这些情况下,您通常会做的就是让类加载器成为加载现有代码的类加载器的子加载器。让实现类实现代码的类加载器中的接口(interface)。使用 Class.asSubclass 使 Class 成为接口(interface)的已知子类型。通过Class.getConstructor.newInstance构造实现类的实例。

使用此技术,您不依赖于使用反射来选择方法,尽管它确实需要无参数构造函数。

关于java - 使用字节数组中的类而不进行反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355197/

相关文章:

java - 如何为这个 CPU 密集型 Java 应用程序提供 GUI?

java - 使用 PhantomJS 启动的 RemoteWebdriver 不打开 https url

android - 在继承方法上使用反射的正确方法

java - 类 Class<T> 的泛型性质是什么意思?什么是T?

scala - 有没有关于 Scala 2.10 的反射 API 的教程?

java - 通过网络接收新类(class)

java - 如何从 Java 访问外部 Jar 中的资源/配置/文本文件?

java - 在 android 中创建一个 jar inside jar 并访问第一个 jar 的类

java - 读取 jar 内的文件?

java - 为什么我的程序的行为仅仅基于 Maven 依赖而改变?