1.概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.获取Class对象
class可以理解为class对象,不是实例对象。也可以理解为字节码对象,代表class文件。
//1.通过数据类型的静态属性class
Class cls = Person.class;
//2.通过Class类的静态方法forName()
Class cls = Class.forName("Person");
3.构造方法Constructor
构造方法就是为了创建对象实例。有两类获取构造对象的方法
//获取公共的 无参构造
Constructor constructor = cls.getConstructor();
//获取公共的 有参构造
Constructor constructor = cls.getConstructor(new Class[]{String.class,String.class});
//获取指定构造的构造对象,也就是公共的、私有的,默认的, 无参构造
Constructor constructor = cls.getDeclaredConstructor();
//返回有参指定构造
Constructor constructor = cls.getDeclaredConstructor(new Class[]{String.class,String.class});
4.创建实例对象
//根据无参构造创建对象
Object o = constructor.newInstance();
//根据有参构造创建对象
Object o = constructor.newInstance(new Object[]{"11", "lisi"});
5.获取实例对象的函数
//获取无参无返回值的方法
Method method = class.getMethod("show");
//调用show方法:
method.invoke();
//获取有参有返回值的方法
Method mth = cls.getMethod("show", new Class[]{int.class,int.class});
//调用cal方法:
Object result = mth.invoke(obj,new Object[]{2,6});
int sum = (int) result;
6.获取属性
//1.获取非私有成员变量
Field field = cls.getField("color");
//给非私有成员变量赋值:
field.set(obj, "yellow");
//获取非私有成员变量的值:
Object color = field.get(obj);
System.out.println("狗的颜色是:"+color);
//2.获取私有成员变量
Field field = cls.getDeclaredField("name");
//给私有成员变量赋值:
field.setAccessible(true);
field.set(obj, "大黄");
//获取私有成员变量的值:
field.setAccessible(true);
Object name = field.get(obj);
System.out.println("狗的名字是:" + name);