what
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
class类
万物皆对象,类是Class类的对象
获取class类
//方式1 通过Object类的getClass方法
Person p = new Person();
Class c1 = p.getClass();
Person p2 = new Person();
Class c2 = p2.getClass();
System.out.println(p == p2);
System.out.println(c1 == c2);//true 一个类的字节码对象只有一个
//方式2 任意对象的静态的class属性
Class c3 = Person.class;
//方式3 通过Class类的静态方法forName()
Class c4 = Class.forName("com.reflect.Person");
System.out.println(c1==c4);
获取类信息
//获取字节码文件对象
Class c = Class.forName("com.reflect.Person");
//获取无参构造器
Constructor con = c.getConstructor();
//通过构造器对象创建对象
Object obj = con.newInstance();
//获取有参构造器
//传递参数的字节码对象
Constructor con = c.getConstructor(String.class,int.class);
//3.创建对象
Object obj = con.newInstance("xyg",15);
//-----------------------------------------------------------------------------
//获取单个公开成员
Field ageField = c.getField("age");
//获取单个私有成员
Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);//设置为true才能访问
//通过Field对象设置成员值
Constructor con = c.getConstructor();
Object obj = con.newInstance();
ageField.set(obj, 12);//给obj对象的field字段赋值12
nameField.set(obj, "xyg");
//-----------------------------------------------------------------------------
//获取class
Class c = Class.forName("com.reflect.Person");
//拿到对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//获取单个无参方法
Method m1 = c.getMethod("show", null);
//无参传递null
m1.invoke(obj, null);
//获取单个有参方法
Method m2 = c.getMethod("function", String.class);
m2.invoke(obj, "xyg");
//获取多参有返回值
Method m3 = c.getMethod("returnValue", String.class,int.class);
System.out.println(m3.invoke(obj, "林青霞",38));
//获取私有方法
Method m4 = c.getDeclaredMethod("hello",null);
m4.setAccessible(true);
m4.invoke(obj, null);
通过反射越过泛型检查
ArrayList<Integer> list = new ArrayList<>();
list.add(24);
list.add(432);
// list.add("fdjsl");ERROR
Class c = list.getClass();
Method m = c.getDeclaredMethod("add", Object.class);//这里要接受Object的字节码
m.invoke(list, "hello");
m.invoke(list, "world");
System.out.println(list);