我知道如果我有一个类文件,我可以在运行时加载它并通过 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/