java - 通过一个方法的字节码动态创建一个java类

标签 java bytecode

我知道如果我有一个类文件,我可以在运行时加载它并通过 classLoader 执行它的方法。但是,如果我只有一个方法的字节码或 Java 代码怎么办?是否可以在运行时动态创建一个类,然后调用该方法?

最佳答案

有一个计划中的功能,JEP 8158765: Isolated Methods , 还有 on the bugtracking list ,这将允许加载和执行此类字节码,而无需生成完全物化的 Class .它可能看起来像

MethodHandle loadCode(String name, MethodType type, byte[] instructions, Object[] constants)

在类里面MethodHandles.Lookup

但是,此功能处于草稿状态,因此在成为实际 API 之前可能需要很长时间,甚至可能会放弃它以支持涵盖用例的完全不同的功能JEP 的作者已经想到了。

在那之前,没有办法在方法的字节码前后生成必要的字节来描述一个完整的类并加载该类。但当然,您可以编写自己的方法来接受方法的字节码和一些元数据,例如预期的签名,生成这样的类并重用该方法。

请注意,除了创建一个新的 ClassLoader 之外还有一个替代方法, Class<?> defineClass​(byte[] bytes) 在类里面MethodHandles.Lookup从 Java 9 开始,它允许将一个类添加到现有的类加载上下文中。

关于java - 通过一个方法的字节码动态创建一个java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56215053/

相关文章:

java - 为什么C和Java代码之间的socket通信只收到64K数据?

java - 在android中将事件添加到用户创建的日历后,事件标题不显示

c++ - 根据编译时构建的函数数量在运行时 C++ 中构建函数

java - Java 版本之间是否存在向后不兼容的具体示例?

python - 如何保护 Python 源代码?

java - Java字节码中的jsr_w和宽指令有什么区别?

java - 为什么编译后的java不向前兼容

java - NotOLE2FileException : Invalid header signature; read 0x0000000000000000, 预期为 0xE11AB1A1E011CFD0 - 文件似乎不是有效的 OLE2 文档

命令提示符中可以识别 Java,但我无法安装任何需要 Java 的程序?

java - Maven 配置不起作用