反射会降低程序的运行效率,但是会极大的提高开发效率!!!
项目开发中会大量用到反射。
public class Demo {
@SuppressWarnings("all")
public static void main(String[] args) {
//反射在程序运行的时候才起作用,编译的时候不起作用
try {
Class<User> clazz = (Class<User>) Class.forName("cn.com.gjw.bean.User");
//通过反射API调用构造方法
User user = clazz.newInstance();//其实是调用了User的无参构造方法
System.out.println(user);
Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
User user2 = c.newInstance(1001, 18, "zhangsan");
System.out.println(user2.getUname());
//通过反射API调用普通方法
User user3 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setUname", String.class);
method.invoke(user3, "lisi");//激活user3对象的setUname方法
System.out.println(user3.getUname());
//通过反射API操作属性
Field field = clazz.getDeclaredField("uname");
//访问私有属性或方法时会报异常
field.setAccessible(true);//这个属性不需要做安全检查了,可以直接访问 (调用反射会降低程序运行性能,在必须使用反射的场合,禁用安全检查可以提高反射的运行速度)
field.set(user3, "wangwu"); //通过反射直接写属性
System.out.println(user3.getUname());
System.out.println(field.get(user3)); //通过反射读属性的值
} catch (Exception e) {
e.printStackTrace();
}
}
}