这两种方式构造实例的区别(Reflect和new)
Differences between these two ways to construct instance(Reflect and new)
我有一个Parent.class(User和Element可以替换成任何类)
public abstract class Parent {
User user;
public void InitUser() {
Fileds f = this.getClass().getDeclaredFields();
for(int i=0; i<f.length; i++) {
f[i].set(this, new Element(i));
}
}
}
Child.class
public class Child extends Parent {
Element e1;
Element e2;
public Child(User user) {
super();
this.user = user;
}
public void doSomethingUsingE1AndE2() {
// do something by using e1 and e2, invoking user's methods.
user.perform(e1);
user.perform(e2);
}
}
在我的Client.class中,以下两种构造和使用Child的方式有区别吗?
1.
public class Client() {
User user = new User();
Class childClass = Class.forName("com.xxx.Child");
Constructor con = childClass .getConstructor(User.class);
Object o = con.newInstance(user);
Method initMethod = child.getSuperclass().getDeclaredMethod(
"InitUser");
initMethod.invoke(o);
Method keyMethod = child.getMethod("doSomethingUsingE1AndE2");
keyMethod.invoke(o);
}
2.
public class Client() {
User user = new User();
Child c = new Child(user);
c.InitUser();
c.doSomethingUsingE1AndE2();
}
非常感谢。
创作没有区别。一种是标准方式 (new),另一种是 Reflection
.
但请记住
Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection.
性能开销
安全限制
内部零件曝光
总是尝试使用 new 方式,除非你别无选择去 Reflection.
在行为上,它是相同的 - 对于这两种方法,您将拥有一个 class 的实例,并且您将调用一些实例方法。
然而,区别在于编译器的使用。
当您以反射方式创建 class 的实例并以反射方式调用此实例上的某些方法时,编译器不会验证您所做的是否正确。避免编译器的帮助,您可能会在运行时遇到不同的错误,例如 NoSuchMethodError
(当您要调用的方法不存在或无法调用时抛出),InvocationTargetException
和其他子classes of ReflectiveOperationException
.
采用非反射方法更安全 - 编译器可以验证您尝试做的事情是否正确(方法是否可访问,参数是否有效等)并会向您抛出编译器错误, 在程序启动之前。
请注意,Reflection 有时非常有用,但是
... if it is possible to perform an operation without using reflection, then it is preferable to avoid using it.
我有一个Parent.class(User和Element可以替换成任何类)
public abstract class Parent {
User user;
public void InitUser() {
Fileds f = this.getClass().getDeclaredFields();
for(int i=0; i<f.length; i++) {
f[i].set(this, new Element(i));
}
}
}
Child.class
public class Child extends Parent {
Element e1;
Element e2;
public Child(User user) {
super();
this.user = user;
}
public void doSomethingUsingE1AndE2() {
// do something by using e1 and e2, invoking user's methods.
user.perform(e1);
user.perform(e2);
}
}
在我的Client.class中,以下两种构造和使用Child的方式有区别吗?
1.
public class Client() {
User user = new User();
Class childClass = Class.forName("com.xxx.Child");
Constructor con = childClass .getConstructor(User.class);
Object o = con.newInstance(user);
Method initMethod = child.getSuperclass().getDeclaredMethod(
"InitUser");
initMethod.invoke(o);
Method keyMethod = child.getMethod("doSomethingUsingE1AndE2");
keyMethod.invoke(o);
}
2.
public class Client() {
User user = new User();
Child c = new Child(user);
c.InitUser();
c.doSomethingUsingE1AndE2();
}
非常感谢。
创作没有区别。一种是标准方式 (new),另一种是 Reflection
.
但请记住
Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection.
性能开销
安全限制
内部零件曝光
总是尝试使用 new 方式,除非你别无选择去 Reflection.
在行为上,它是相同的 - 对于这两种方法,您将拥有一个 class 的实例,并且您将调用一些实例方法。
然而,区别在于编译器的使用。
当您以反射方式创建 class 的实例并以反射方式调用此实例上的某些方法时,编译器不会验证您所做的是否正确。避免编译器的帮助,您可能会在运行时遇到不同的错误,例如 NoSuchMethodError
(当您要调用的方法不存在或无法调用时抛出),InvocationTargetException
和其他子classes of ReflectiveOperationException
.
采用非反射方法更安全 - 编译器可以验证您尝试做的事情是否正确(方法是否可访问,参数是否有效等)并会向您抛出编译器错误, 在程序启动之前。
请注意,Reflection 有时非常有用,但是
... if it is possible to perform an operation without using reflection, then it is preferable to avoid using it.