我使用ClassLoader
中的defineClass()
方法来根据字节数组定义一个类。我使用反射获取该方法:
ClassLoader.class.getDeclaredMethod(
"defineClass", String.class, byte[].class, int.class, int.class);
Java10对defineClass
的反射使用进行了投诉。
我应该使用什么代替?
我使用ClassLoader
中的defineClass()
方法来根据字节数组定义一个类。我使用反射获取该方法:
ClassLoader.class.getDeclaredMethod(
"defineClass", String.class, byte[].class, int.class, int.class);
Java10对defineClass
的反射使用进行了投诉。
我应该使用什么代替?
MethodHandles.Lookup.defineClass 似乎是一个可靠的替代方案。然而,需要注意的是,您定义的类必须与查找的查找类在同一运行时包中。您将无法创建其他模块中存在的包中的类,这是之前的方法所没有的限制。根据您的使用情况,这些问题可能会或可能不会出现。
如果您想深入了解该主题,Rafael Winterhalter 在他的博客上对新的限制进行了讨论并结合 Byte Buddy 展开了相关工作。如果您足够了解任意运行时类定义的相关问题,这可能会对您感兴趣。
Lookup.defineClass()
- Brian Goetz