【问题标题】:Load a class which implements another one - Java加载一个实现另一个类的类 - Java
【发布时间】:2019-05-16 18:48:55
【问题描述】:

我试图通过获取它们的字节并使用反射来动态加载一些类来使用 defineClass 方法。这是我的代码(这是一个循环)

Method m = java.lang.ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
            m.setAccessible(true);
            m.invoke(Main.class.getClassLoader(), className, classBytes, 0, classBytes.length);

但是当一个类实现另一个类时,它会抛出 NoClassDefFoundError(实现的类尚未加载)。我不知道该怎么做,我尝试加载几次以解决此问题,但它不起作用。我还搜索在加载它们之前将所有类添加到类路径中,但我不知道如何使用字节数组来执行此操作。

【问题讨论】:

  • 您确定您传递的类名与数组中字节定义的类匹配吗?请注意,它是预期的 binary 名称,它与 Java 源代码中使用的形式不同。或者你应该能够通过传递null 作为类名来回避整个问题,前提是你确信你的字节定义了你想要的类。
  • 是的,它匹配,即使我将null 作为参数传递,它也找不到实现的类。这很奇怪,因为没有实现一个类它可以完美地工作。

标签: java class dynamic reflection


【解决方案1】:

动态类加载器是 Java 所做的。不需要绕过语言访问限制。以通常的方式子类SecureClassLoader

【讨论】:

  • 你的意思是我应该使用不带反射的SecureClassLoader 而不是带反射的ClassLoader
  • @outrage 使用类会有一些反思。但是你不需要搞砸setAccessible
  • 哦,好吧,我明白了,但区别只是有权限吗?我添加了加载字节数组的类的 CodeSource,但它仍然向我抛出关于无法找到的已实现类的错误(尚未加载)。 Main.class.getProtectionDomain().getCodeSource()
  • @outrage 否。在外部使用loadClass 获取Class。实现findClass 来定义类。 java.lang.ClassLoader 的 API 文档中有一些示例代码。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多