使用反射加载 class 时避免 ClassNotFoundException
Avoiding ClassNotFoundException while loading class using reflection
我正在尝试使用下面代码中给出的方法 Class.forname("classname")
通过反射动态加载 class。
Class<? extends Layout> layoutClassName;
try {
layoutClassName = (Class<? extends Layout>) Class.forName(site.getSiteLayout());
} catch (ClassNotFoundException e) {
layoutClassName= DefaultLayout.class;
}
我正在尝试动态加载 class 如果它是由登录用户定义的(数据库配置),否则提供默认实现。
这工作正常,但经过统计分析后我们发现大约 80% 的时间使用默认实现。
这意味着大约 80% 的时间都会创建 Exception 对象。由于创建异常对象很繁重,我想避免它并使用其他一些逻辑来识别 class 是否存在。
求推荐。
PS:我不寻求任何显着的性能提升,我只是想清理我现有的代码。
如你所说...
I am trying to load a class dynamically if it is defined in configuration
是否在某些文件中提到了 'configuration'。
我希望你能拿到配置文件(或配置状态),并只为 class 创建对象,并且只有在提到的情况下才这样做。如果不应用默认实现。
如果您无法访问配置,据我所知没有其他方法。
我不知道是否有一种方便的方法来检查 class 是否存在而不抛出 ClassNotFoundException
这适用于一般情况。
在这种情况下,处理 ClassNotFoundException
似乎是恰当且明确的。前面有几个问题都推荐处理异常:1, 2, 3
但如果你真的想:
- 动态加载布局(因此,您无法避免反射);
- 通过不受限制的 class 名称加载布局(如果您没有配置,则无法构建已定义且相对稳定的所有布局列表 classes);
- 出于某种原因最小化
ClassNotFoundException
。
然后我可以建议缓存布局 classes。如果您没有大量不同的布局,这样的方法可能会起作用:
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;
}
}
这样您就不会检查相同的布局两次。
我正在尝试使用下面代码中给出的方法 Class.forname("classname")
通过反射动态加载 class。
Class<? extends Layout> layoutClassName;
try {
layoutClassName = (Class<? extends Layout>) Class.forName(site.getSiteLayout());
} catch (ClassNotFoundException e) {
layoutClassName= DefaultLayout.class;
}
我正在尝试动态加载 class 如果它是由登录用户定义的(数据库配置),否则提供默认实现。
这工作正常,但经过统计分析后我们发现大约 80% 的时间使用默认实现。
这意味着大约 80% 的时间都会创建 Exception 对象。由于创建异常对象很繁重,我想避免它并使用其他一些逻辑来识别 class 是否存在。
求推荐。
PS:我不寻求任何显着的性能提升,我只是想清理我现有的代码。
如你所说...
I am trying to load a class dynamically if it is defined in configuration
是否在某些文件中提到了 'configuration'。
我希望你能拿到配置文件(或配置状态),并只为 class 创建对象,并且只有在提到的情况下才这样做。如果不应用默认实现。
如果您无法访问配置,据我所知没有其他方法。
我不知道是否有一种方便的方法来检查 class 是否存在而不抛出 ClassNotFoundException
这适用于一般情况。
在这种情况下,处理 ClassNotFoundException
似乎是恰当且明确的。前面有几个问题都推荐处理异常:1, 2, 3
但如果你真的想:
- 动态加载布局(因此,您无法避免反射);
- 通过不受限制的 class 名称加载布局(如果您没有配置,则无法构建已定义且相对稳定的所有布局列表 classes);
- 出于某种原因最小化
ClassNotFoundException
。
然后我可以建议缓存布局 classes。如果您没有大量不同的布局,这样的方法可能会起作用:
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;
}
}
这样您就不会检查相同的布局两次。