参考文章:
https://www.jianshu.com/p/de206c18ce08
newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
newInstance()对应于工厂模式的使用,class.forname(类a1)获取类名,newInstance()实例化一个对象,返回对象可以是类a1对应的接口A,由此,只要满足A的类a1、a2...都能采用相应的代码
String className = "a1";//可以配置文件读相关class名
class c = Class.forName(className);
factory = (AInterface)c.newInstance();
工厂模式
参考
https://www.cnblogs.com/zailushang1996/p/8601808.html
1、简单模式
基类、抽象类或接口,设定基础
public abstract class INoodles {
public abstract void desc();
}
不同的具体类继承或实现,用重写定义类的属性
public class LzNoodles extends INoodles { @Override public void desc() { System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗"); } }public class GankouNoodles extends INoodles {
@Override
public void desc() {
System.out.println("还是家里的干扣面好吃 6块一碗");
}
}public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static final int TYPE_GK = 3;//干扣面public static INoodles createNoodles(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
case TYPE_PM:
return new PaoNoodles();
case TYPE_GK:
default:
return new GankouNoodles();
}
}
}
工厂模式扩展
参考:https://www.cnblogs.com/kubixuesheng/p/10344427.html#_label3
public interface FruitE {
void get();
}public class BananaE implements FruitE {
@Override
public void get() {
System.out.println("香蕉");
}
}public class AppleE implements FruitE {
@Override
public void get() {
System.out.println("苹果");
}
}
// 新的工厂类
public class FruitFactoryFive {
public static FruitE getFruit(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class fruit = Class.forName(type);
return (FruitE) fruit.newInstance();
}
}
// 客户端
private static void five() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
FruitE apple = FruitFactoryFive.getFruit("simpleFactory.five.AppleE");
FruitE banana = FruitFactoryFive.getFruit("simpleFactory.five.BananaE");apple.get();
banana.get();
}
有参数构造函数的反射
参考:https://blog.csdn.net/qq_35146878/article/details/78503997
public class Main { public static void main(String[] args) throws Exception{ //当我不想 newInstance初始化的时候执行空参数的构造函数的时候 //可以通过字节码文件对象方式 getConstructor(paramterTypes) 获取到该构造函数 String classname="demo2.Person"; //寻找名称的类文件,加载进内存 产生class对象 Class cl=Class.forName(classname); //获取到Person(String name,int age) 构造函数 Constructor con=cl.getConstructor(String.class,int.class); //通过构造器对象 newInstance 方法对对象进行初始化 有参数构造函数 Object obj=con.newInstance("神奇的我",12); } }
上述方式dao层抽象中常用,在janusgraph的backend中应用