通过一种方法的字节码动态创建Java类

时间:2019-05-20 05:57:31

标签: java bytecode

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

2 个答案:

答案 0 :(得分:2)

有一个计划的功能JEP 8158765: Isolated Methods,也有on the bugtracking list,该功能将允许加载和执行这样的字节码,而无需生成完全实现的Class。看起来像

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

MethodHandles.Lookup类中的

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

直到那时,在方法的字节码之前和之后都无法生成必要的字节来描述完整的类并加载该类。但是,当然,您可以编写自己的方法来接受方法的字节码和一些元数据(例如期望的签名),生成此类并重用该方法。

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

答案 1 :(得分:1)

方法的字节码引用了类的常量池中的条目,因此孤立地讲没有意义。