Java 在当代JDK(11+;)上,反射是否仍然效率低下?
我希望避免使用大得离谱的switch语句,因此我创建了以下方法:Java 在当代JDK(11+;)上,反射是否仍然效率低下?,java,reflection,Java,Reflection,我希望避免使用大得离谱的switch语句,因此我创建了以下方法: private static Map<String, Constructor<?>> constructorCache = new ConcurrentHashMap<>(); public static Object instantiate(String path, Object... params) { try { Constructor<?&
private static Map<String, Constructor<?>> constructorCache = new ConcurrentHashMap<>();
public static Object instantiate(String path, Object... params) {
try {
Constructor<?> cons = null;
if(constructorCache.containsKey(path)) {
cons = constructorCache.get(path);
}
else {
Class<?>[]clazzes = new Class<?>[params.length];
for(int a = 0; a != params.length; a++)
clazzes[a] = params[a].getClass();
Class<?> clazz = Class.forName(path);
cons = clazz.getConstructor(clazzes);
}
return cons.newInstance(params);
} catch (Exception e) {
throw new RuntimeException("Error while instantiating " + path + " Stacktrace: " + e.getStackTrace());
}
}
私有静态映射cons=null;
if(constructorCache.containsKey(路径)){
cons=constructorCache.get(路径);
}
否则{
类别[]类别=新类别[参数长度];
for(int a=0;a!=params.length;a++)
clazzes[a]=params[a].getClass();
Class clazz=Class.forName(路径);
cons=clazz.getConstructor(clazzes);
}
返回cons.newInstance(参数);
}捕获(例外e){
抛出新的RuntimeException(“实例化“+path+”Stacktrace时出错:+e.getStackTrace());
}
}
这种做法不好吗,特别是对于性能关键型代码?反射是不好的,因为Java是一种静态类型的语言,避免了编译器提供的任何帮助,这将使您面临一个错误的世界。至少10年来,绩效一直不是WRT反映的相关问题。问题是正确性。@Michael实际上,反射会影响性能。JIT编译器很难优化反射。也就是说,你的第一句话是对的。埃文,无论你想做什么,几乎可以肯定有一种更好的方法,不需要思考;但是如果没有更多关于目标的知识,就很难推荐任何东西。目标是从名称字符串解析对象。我最后只是做了一个返回的方法,其中a是一个抽象类。内部是一个大型switch语句,它将适当的结果强制转换为T。