Java之反射

xiaoxiao2021-02-28  99

反射就是把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 允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点

性能问题 代码维护问题 可以使用私有的属性和方法,破坏了代码块的安全性
转载请注明原文地址: https://www.6miu.com/read-40046.html

最新回复(0)