Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Class.getConstructor的替代方案[出于性能原因]_Java_Performance_Class_Reflection_Getconstructor - Fatal编程技术网

Java Class.getConstructor的替代方案[出于性能原因]

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

我正在尝试动态加载~10000个类,代码如下所示:

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的确切类型具有类的返回类型。