反射机制:
指的是可以于运行时加载、探知、使用编译期间完全未知的类
程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都
能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性
Class c = Class.forName(“包名.类名”);
Class类的对象如何获取呢?
- 运用getClass()
- 运用Class.forName()
- 运用.class语法
动态反射API操作构造器、方法、属性实例:
public class Demo03 {
public static void main(String[] args) {
String path ="cn.qlu.test.bean.User";
try {
Class<User> clazz =(Class<User>) Class.forName(path);
//动态调用构造方法,构造对象
User u = clazz.newInstance();
System.out.println(u);
Constructor<User> c = clazz.getDeclaredConstructor(int.class,String.class,int.class);
User u2 = c.newInstance(10001,"lee",10);
System.out.println(u2.getName());
//通过反射API,调用普通方法
User u3 =clazz.newInstance();
Method method = clazz.getDeclaredMethod("setName", String.class);
method.invoke(u3, "lizeya"); //u3.setUname("lee");
System.out.println(u3.getName());
//通过反射API,反射属性
User u4 =clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);//这个属性不需要检查
f.set(u4 , "llllll");
System.out.println(u4.getName());
System.out.println(f.get(u4));
} catch (Exception e) {
e.printStackTrace();
}
}
}
setAccessible 启用(true)和禁用(false)访问安全检查的开关
反射降低了运行效率
文章仅供个人学习,如有错误请指出!