【发布时间】:2021-11-02 16:54:52
【问题描述】:
以下是我如何在运行时根据我想要调用的子类来构造对象(以避免每次我想添加新的子类时都必须更新 Factory 类):
import java.lang.reflect.InvocationTargetException;
public class Main{
private static final class X{}
private static abstract class A{
public A(X x){}
public static A newInstance(Class<? extends A> subType, X x) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
return subType.getConstructor(X.class).newInstance(x);
}
}
private static final class A_1 extends A{
public A_1(X x){
super(x);
//...
}
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
for(int i = 0; i < 1000; i++){
X x = new X();
long t = System.currentTimeMillis();
A a = A.newInstance(A_1.class, x);
t = System.currentTimeMillis() - t;
System.out.println(t);
}
}
}
起初我认为它会很慢,但第一次迭代得到 1 毫秒,任何连续实例化得到 0。
部署我的应用程序后,我能否期待类似的行为(这里我简化了流程,但在我的应用程序上下文中几乎没有任何困难)。
做这种技术有什么好处和坏处?
【问题讨论】:
-
一毫秒实际上是相当长的时间。您可能希望以纳秒为单位进行测量。
-
缺点:没有编译时检查
A_1是否存在匹配的构造函数。缺点:反射构造函数的参数类型必须完全是X(不仅仅是与X兼容的类型)。
标签: java reflection factory