现有几个类,构造函数的参数都是一样的,就是创建的实例对象不一样。具体如下:
class StringFunction{
String id;
public StringFunction(){}
public StringFunction(String id){
this.id=id;
System.out.println("创建了StringFunction实例");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
class IntegerFunction{
Integer id;
public IntegerFunction(Integer id){
this.id=id;
System.out.println("创建了IntegerFunction实例");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
class LongFunction{
Long id;
public LongFunction(Long id){
this.id=id;
System.out.println("创建了IntegerFunction实例");
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
}
现在,想要根据传进来的参数创建实例对象,发现上面几个类的带参构造函数都是传一个id,然后将这个id赋给成员变量id,这时候我就想能不能有一个创建一个公共的类,通过构造函数创建实例对象,也是将值赋给成员变量id。可以使用Java的泛型,如下:
public class Factory<T> {
private T pk;
public Factory(){}
public Factory(T pk){
this.pk=pk;
}
}
Factory创建实例的时候,确实是通过构造函数将id传给成员变量id了,但是创建的是Factory实例对象,我就是想要一个StringFunction类的实例对象,怎么办?
这个时候反射就体现他的作用了。
能否编写一个根据传过来的 类 和 参数数组 创建对应的实例变量的方法呢?这就要用到Java的范式和反射,代码如下:
public class Factory<T> {
public T getObject(Class<? extends T> myClass, Object[] parameters) throws Exception {
//创建参数类型数组
Class[] parametersType = new Class[parameters.length];
//获取各参数类型
for (int i = 0; i < parameters.length; i++) {
Class<?> aClass = parameters[i].getClass();
parametersType[i] = aClass;
}
//根据参数类型获取相应的构造函数
Constructor<? extends T> constructor = myClass.getConstructor(parametersType);
//返回实例对象
return constructor.newInstance(parameters);
}
}
调用:
class Test {
public static void main(String[] args) throws Exception {
Object[] param = {"myPK"};
Factory<StringFunction> factory = new Factory<StringFunction>();
StringFunction stringFunction = factory.getObject(StringFunction.class, param);
}
}
结果如下:
通过反射获取某个类的实例对象,构造函数的参数也可以根据需要变化,个人觉得复用性很强,为了方便就简写一个类,想要开发项目的,建议写成接口。