Java Class.getConstructor的替代方案[出于性能原因]
我正在尝试动态加载~10000个类,代码如下所示:Java Class.getConstructor的替代方案[出于性能原因],java,performance,class,reflection,getconstructor,Java,Performance,Class,Reflection,Getconstructor,我正在尝试动态加载~10000个类,代码如下所示: Class<?> c = getClass().getClassLoader().loadClass(className); Constructor<?> constr = c.getConstructor(String.class); constr.newInstance(myString); Class c=getClass().getClassLoader().loadClass(类名); Constructor
Class<?> c = getClass().getClassLoader().loadClass(className);
Constructor<?> constr = c.getConstructor(String.class);
constr.newInstance(myString);
Class c=getClass().getClassLoader().loadClass(类名);
Constructor constr=c.getConstructor(String.class);
constr.newInstance(myString);
在评测方面,我注意到大部分时间都花在getConstructor
调用上,这似乎平均花费了15毫秒,显然乘以10k的总和
有没有关于编写此文件以加快java反射速度的建议
p、 不幸的是,这些类必须动态加载(否则我根本不会使用反射)大概是初始化类的代价。这可以通过将
.loadClass(className)
更改为.loadClass(className,true)
来检查。如果它们是生成的类,那么可能有一些地方可以更改,例如用公共代码替换静态字段上的大型文本数组,以从字符串文本中提取数据
编辑:刚刚选中,该标志正在解析(链接)Class.forName(className,true,loader)
要初始化吗?一团糟
如果您想尝试方法句柄,那么代码将大致如下所示:
MethodType methodType = MethodType.methodType(
Void.TYPE, String.class
);
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
... for each class ...
lookup.findConstructor(c, methodType).invokeExact(myString);
您可以尝试MethodHandles。
invokeExact
将失败,因为MethodHandle的确切类型具有类的返回类型。