反射就是把Java类中的各种成分映射成一个个的java对象。
1.Java反射常用类
Class类—可获取类和类的成员信息
Field类—可访问类的属性
Method类—可调用类的方法
Constructor类—可调用类的构造方法
2.如何使用反射
1.导入java.lang.reflect.*
2.获得需要操作的类的Java.lang.Class对象
3.调用Class的方法获取Field、Method等对象
4.使用反射API进行操作 (设置属性﹑调用方法)
3.Class类
1)Class类是Java 反射机制的起源和入口
每个类都有自己的Class 对象且每一个类只有一个class 对象
用于获取与类相关的各种信息
提供了获取类信息的相关方法
Class类继承自Object类
2)Class类存放类的结构信息
3)【类对象】获取类的Class 对象
方法1:对象.getClass()
Person person = new Person();
Class class2 = person.getClass();
方法2:类.class
Class class1 = Person.class;
方法3:Class.forName()
Class class3 = Class.forName("com.qf.demo.Person");
使用forname方法,参数为相对于本工程的Person类文件路径
4)【属性】获取Field 对象
【只能获取public的属性】Field[] fields = class1.getFields();
【获取所有属性】Field[] fields2 = class1.getDeclaredFields();
public属性
【得到指定的属性对象】Field field = class1.getField("age");
【 给属性赋值】field.set(object, 5);
【得到属性值,返回的是对象】Object object2 = field.get(object);
静态属性
【获取属性对象】Field field2 = class1.getDeclaredField("weight");
【属性赋值】field2.set(null, 10);
【获取属性值】Object object3 = field2.get(null);
私有属性
Field field3 = class1.getDeclaredField("name");
【设置权限】field3.setAccessible(true);
field3.set(object, "小花");
Object object4 = field3.get(object);
5)【方法】获取Method 对象
--Method[] methods = class1.getMethods();// 得到【本类和父类】的【非私有】的方法
--Method[] methods2 = class1.getDeclaredMethods();// 得到【本类】中声明的所有的方法【包括私有】
--【得到无参无返回值方法】Method method = class1.getMethod("eat", null);
【方法调用】method.invoke(object, null);// 参数1:对象;参数2:方法参数
--【得到有参无返回值方法】Method method2 = class1.getMethod("drink", String.class);
【方法调用】method2.invoke(object, "水");
--【得到无参有返回值方法】Method method3 = class1.getMethod("sleep", null);
【调用】Object object2 = method3.invoke(object, null);//返回值都是用对象接收
--【静态方法】Method method4 = class1.getMethod("hehe", null);
【调用,不需要传对象】method4.invoke(null, null);
--【私有方法】Method method5 = class1.getDeclaredMethod("play", null);
【必须设置访问权限】method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
【调用】method5.invoke(object, null);
6)【构造方法】获取Constructor对象
【获取所有构造方法】Constructor[] constructors = class1.getConstructors();
【得到无参的构造方法】Constructor constructor = class1.getConstructor(null);
【创建对象】Person person = (Person) constructor.newInstance(null);
【得到有参的构造方法】Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
【创建对象】Person person2 = (Person) constructor2.newInstance("张三",5,9);
4.反射优缺点
优点
1 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力
2 允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点
性能问题
代码维护问题
可以使用私有的属性和方法,破坏了代码块的安全性