Java 使用反射加载类时避免ClassNotFoundException
我正试图使用下面代码中给出的方法Java 使用反射加载类时避免ClassNotFoundException,java,exception,if-statement,reflection,classloader,Java,Exception,If Statement,Reflection,Classloader,我正试图使用下面代码中给出的方法class.forname(“classname”)通过反射动态加载一个类 Class<? extends Layout> layoutClassName; try { layoutClassName = (Class<? extends Layout>) Class.forName(site.getSiteLayout()); } catch (ClassNotFoundException e) { layoutCla
class.forname(“classname”)
通过反射动态加载一个类
Class<? extends Layout> layoutClassName;
try {
layoutClassName = (Class<? extends Layout>) Class.forName(site.getSiteLayout());
} catch (ClassNotFoundException e) {
layoutClassName= DefaultLayout.class;
}
Class正如你所说
如果在配置中定义了类,我将尝试动态加载该类
是某个文件中提到的“配置”
我希望您能够掌握配置文件(或配置状态),并且仅在提到要为类创建对象时才为类创建对象。如果没有,则应用默认实现
如果您无法访问配置,我担心就我所知,没有其他方法。我不知道是否有一种方便的方法来检查类是否存在,而不抛出适用于一般情况的ClassNotFoundException
在这种情况下,处理ClassNotFoundException
似乎是适当和清晰的。前面有几个问题都建议处理异常:
但如果你真的想:
- 动态加载布局(因此,您无法避免反射)李>
- 按不受限制的类名加载布局(如果您没有配置,则无法构建所有布局类的已定义且相对稳定的列表)李>
- 出于某种原因最小化
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;
}
}
private hashmap尝试类的forName(String name,boolean initialize,ClassLoader)方法,并将参数initialize设置为false。我只是试图清理现有代码。
在这种情况下,异常处理似乎足够干净。我认为如果不使用特殊方法(所有布局类的列表等),就不可能在这里避免ClassNotFoundException
。@Jabir此方法还将抛出ClassNotFoundException
,只是不要使用反射如果这只在启动或配置时运行,请不要担心。异常处理在这里很好。不幸的是,情况并非如此。编辑问题以获得更多澄清。我所说的配置是指用户定义的配置,它是从数据库中存储和获取的。我所说的配置是指用户定义的配置,它是从数据库中存储和获取的??我想你的任何程序代码都可以访问数据库。如果是这样的话,那就很容易了。这个hashmap的填充可以完成一次(或者只在添加/删除新布局时)。看起来是个不错的选择。谢谢