gpt4 book ai didi

java - 使用反射加载类时避免 ClassNotFoundException

转载 作者:行者123 更新时间:2023-11-30 08:48:28 24 4
gpt4 key购买 nike

我正在尝试使用 Class.forname("classname") 方法通过反射动态加载一个类,如下面的代码所示。

Class<? extends Layout> layoutClassName;
try {
layoutClassName = (Class<? extends Layout>) Class.forName(site.getSiteLayout());
} catch (ClassNotFoundException e) {
layoutClassName= DefaultLayout.class;
}

我正在尝试动态加载一个类,如果它是由登录用户定义的(数据库配置),否则提供默认实现。

这工作正常,但经过统计分析后我们发现大约 80% 的时间使用默认实现。

这意味着大约 80% 的时间都会创建 Exception 对象。由于创建异常对象很繁重,我想避免它并使用一些其他逻辑来识别类是否存在。

请提出建议。

PS:我不寻求任何显着的性能提升,我只是想清理我现有的代码。

最佳答案

我不知道是否有一种方便的方法可以在不抛出 ClassNotFoundException 的情况下检查类是否存在,这适用于一般情况。

在这种情况下,处理 ClassNotFoundException 似乎是合适且明确的。有几个早期的问题都建议处理异常:1 , 2 , 3

但是如果你真的想:

  • 动态加载布局(因此,您无法避免反射);
  • 通过不受限制的类名加载布局(如果您没有配置,则无法构建已定义且相对稳定的所有布局类列表);
  • 出于某种原因最小化 ClassNotFoundException

然后我可以建议缓存布局类。如果您没有大量不同的布局,那么这样的方法可能会起作用:

private HashMap<String, Class<? extends List>> layoutsByName  = new HashMap<>();

public Class<? extends Layout> getLayout(String name) {
Class<? extends Layout> layoutClass = layoutsByName.get(name);
if(layoutClass!=null) {
return layoutClass;
}
layoutClass = getLayoutUsingReflection(name);
layoutsByName.put(name, layoutClass);
return layoutClass;
}

private Class<? extends Layout> getLayoutUsingReflection(String name) {
try {
return (Class<? extends Layout>) Class.forName(name);
} catch (ClassNotFoundException e) {
return DefaultLayout.class;
}
}

这样您就不会检查相同的布局两次。

关于java - 使用反射加载类时避免 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31935324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com