Java 在当代JDK(11+;)上,反射是否仍然效率低下?

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<?&

我希望避免使用大得离谱的switch语句,因此我创建了以下方法:

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。