reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:
import java.lang.reflect.*;
public class field2 {
public double d;
public static void main(String args[]) {
try {
Class cls = Class.forName("field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
} catch (Throwable e) {
System.err.println(e);
}
}
}
这个不知有什么好处,不用它我也能把对象数据字段的值改变了啊,刚接触反射,请大家指点。
import java.lang.reflect.*;
public class field2 {
public double d;
public static void main(String args[]) {
try {
Class cls = Class.forName("field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
} catch (Throwable e) {
System.err.println(e);
}
}
}
这个不知有什么好处,不用它我也能把对象数据字段的值改变了啊,刚接触反射,请大家指点。
比如你可以在完全不知到是什么类的情况下,给这个类的某个字段赋值。
(事实上有很多类有get,set方法)。
而你要把这个不知到是什么类的类生成对象并注入数据。
只要传入个类名,反射出"set"开头的方法invoke就行了。
那这样就对任何有get,set的方法的类都有用了。
Spring struts 等很多xml文件里面配置的类全名,都是用反射来创建对象的。
</bean>这是常见的spirng配置文件,我们配置了这个,spring就能创建这个类的对象,实际上就是通过反射来创建的。很多xml里面配置的类全名,都是通过反射的方式创建对象的。Class cla=Class.forName("reflect.Student");
Class[] paraTypes =new Class[]{int.class,String.class,String.class,String.class};
Constructor contructor=cla.getConstructor(paraTypes);
Object[] objs=new Object[]{32,"姚明","上海市","13888888888"};
Student stu=(Student)contructor.newInstance(objs);
System.out.println(stu.jok(stu));
try {
Class cls = Class.forName(clsname);
Object intance = cls.instance();
Method[] ms = cls.getMethods();
for(int i=0;i<ms.length;i++) {
String mname = ms[i].getName();
if(mname.starwith("set")) {
ms[i].invoke(intance,/*数据*/);
}
}
return instance;
} catch (Exception e) {
System.err.println(e);
}
}
User user = (User)getInstance("User");
Admin admin = (Admin)getInstance("Admin");
Teacher theacher = (Teacher)getInstance("Theacher");
....
//可以类名取得对象,而且是有数据的(数据可以是来自数据库)。
}
它运行时动态地加载类,甚至是通过网络来加载一个类。
用的好的话几乎是无所不能,哈哈,扯远了。