检查类是否存在的一种常见方法是执行 Class.forName("my.Class")。您可以使用捕获 ClassNotFoundException 的 try/catch 来包装它并决定要做什么。如果需要,您可以在具有 main() 的包装类中执行此操作。您可以尝试加载该类,如果成功,则在加载的类上调用 main() ,如果没有,则执行其他操作。
public static void main(String arg[]) {
try {
Class.forName("my.OtherMain");
// worked, call it
OtherMain.main();
} catch(ClassNotFoundException e) {
// fallback to some other behavior
doOtherThing();
}
}
Class.forName()是Java中的一个反射方法,用于根据类的完整限定名(fully qualified name)加载类并返回对应的Class对象。它的作用是在运行时动态地加载类,可以在编写通用代码时动态地加载不同的类,从而实现更高的灵活性和可扩展性。
Class.forName(xxx.xx.xx) 返回的是一个类,newInstance() 后才创建一个对象
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
Class clazz = Class.forName(xxx.xx.xx);
Object anInstance = clazz.newInstance();
结合工厂模式
public interface IProuduct {
void doSomeThing();
}
具体产品
/**
* 具体产品
*/
@Slf4j
public class ProductA implements IProuduct {
@Override
public void doSomeThing() {
log.info("我是ProductA");
}
}
@Slf4j
public class ProductB implements IProuduct {
@Override
public void doSomeThing() {
log.info("我是ProductB");
}
}
简单工厂类SimpleFactory
public class SimpleFactory {
public static IProuduct makeProduct(String productName) {
if ("ProductA".equals(productName)) {
return new ProductA();
} else if ("ProductB".equals(productName)) {
return new ProductB();
} else {
return null;
}
}
}
客户端Client类:
public class Client {
public static void main(String[] args) {
// 生成产品B
IProuduct product = SimpleFactory.makeProduct("ProductB");
product.doSomeThing();
}
}