Java:字节码的新实例

Java:字节码的新实例,java,reflection,assembly,bytecode,java-bytecode-asm,Java,Reflection,Assembly,Bytecode,Java Bytecode Asm,我想从字节数组创建新的类实例。我该怎么做?有可能吗 ClassWriter cw = new ClassWriter(...); byte[] bytes = cw.toByteArray(); 参考: 这是可能的,您需要使用反射来实现这一点。psuedo代码为: ClassLoader.defineClass() 我可以通过扩展ClassLoader和使用defineClass来创建这个类。但是,创建的类将我的扩展类加载器作为它的类加载器,这会在我的类的代码加载其他类时导致失败。大概我

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

ClassWriter cw = new ClassWriter(...);
byte[] bytes = cw.toByteArray();
参考:


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

      ClassLoader.defineClass()
      

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

      可能重复@bruno conde:看起来像。我们只是用一种更简洁的方式来表达你可以使用defineClass,但是除非你使用自定义类加载器,否则你可能需要使用反射来调用它,因为它不是一个公共方法。都更改了。感谢您的编辑,我正在努力解决这个问题,但解析器不想正确显示链接。+1。无论如何,该方法是受保护的,因此您需要一种访问它的方法。扩展类加载器并提供一个公共方法可能是一个解决方案。我非常确定
      loadIntoCurrentClassLoader(bytes)
      部分就是问题所在:-)好的,所以我有点过火了;)从问题的措辞来看,它是模棱两可的。重点不是clazz.newInstance()。这里的重点是如何获得clazz。反射在这里没有帮助,应该使用classLoader.defineClass()
      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);
      }