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的填充可以完成一次(或者只在添加/删除新布局时)。看起来是个不错的选择。谢谢