【问题标题】:Java: new instance from bytecodeJava:来自字节码的新实例
【发布时间】:2010-11-23 17:41:08
【问题描述】:
ClassWriter cw = new ClassWriter(...);
byte[] bytes = cw.toByteArray();

我想从bytes 数组创建新的类实例。我该怎么做呢?有可能吗?

【问题讨论】:

  • @bruno conde:看起来像。我们只是在这里用更简洁的方式表达事物
  • 您可以使用defineClass,但是除非您使用自定义类加载器,否则您可能需要使用反射来调用它,因为它不是公共方法。

标签: java reflection assembly bytecode java-bytecode-asm


【解决方案1】:

【讨论】:

  • 不错的答案,但格式很糟糕,还有一个 java 1.4 链接。两者都改变​​了。
  • 感谢编辑,正在为此苦苦挣扎,但解析器不想正确显示链接。
  • +1。无论如何,该方法受到保护,因此您需要一种访问它的方法。扩展 ClassLoader 并提供公共方法可能是一种解决方案。
【解决方案2】:

这是可能的,您需要使用反射来实现这一点。伪代码是:

final Class clazz = loadIntoCurrentClassLoader(bytes); //I'm assuming you wrote this already using defineClass

final YourClass foo ;
try {
    foo = (YourClass) clazz.newInstance();
}
catch (final Exception e) {
    throw new RuntimeException(e);
}

【讨论】:

  • 我很确定loadIntoCurrentClassLoader(bytes) 部分就是问题所在:-)
  • 好吧,所以我有点过火了;)
  • 从问题的措辞上看是模棱两可的。
  • 重点不是 clazz.newInstance()。这里的重点是如何获得 clazz。反射在这里没有帮助,你应该使用 classLoader.defineClass()
【解决方案3】:

我可以通过扩展 ClassLoader 并使用 defineClass 来创建类。但是随后创建的类将我的扩展类加载器作为它的类加载器,当我的类的代码加载其他类时会导致失败。大概我可以通过创建我的 ClassLoader 来以正确的方式委派所有内容来解决这个问题,但如何做到这一点并不明显。

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多