反射机制详情
6/100
发布文章
weixin_69252724
未选择文件
反射
一、 背景
在之前, 仅仅知道一个类名就可以得到类的信息
例如:` 1. <servlet class="">/<servlet> 2. <select id="" resultType=""> 3. mybatis里的session.getMapper(Mapper绑定的Dao接口)
在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变
有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性
二、 概念
反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息
三、. 反射
User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象通过Class对象可以获取类里的信息
反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们
四、获取类的class对象
通过对象名获取
USer user = new User();
Class u = user.getClass();
通过类名.class获取类的Class对象
Class u2 = User.class();
通过Class.forName("类名获取")
Class u3 = Class.forName("com.jwq.reflect.User")
1、通过class对象获取构造方法对象
//获取公共的构造方法
Constructor constructor = u1.getConstructor();
Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
//获取私有的构造方法 也可以获取公共构造
Constructor constructor3 = u1.getDeclaredConstructor();
//设置对私有权限的构造方法进行操作
constructor3.setAccessible(true);
//通过构造方法来创建对象
Object user = constructor.newInstance();
Object user2 = constructor2.newInstance("Nelson",19,"男");
2. class对象获取属性对象
getField("指定字段)
getDeclaredFields("指定字段")
getFields()
getDeclaredFields()
可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性
3. 通过Class对象获取啊方法对象
Constructor constructor = u.getDeclaredConstructor();
constructor.setAccessible(true);
Object user = constructor.newInstance();
//---------------------------------
Method setName = u.getMethod("setName", String.class);
//---------------------------------
setName.invoke(user, "老铁"); // invoke(对象名,参数值)
五、反射优缺点
优点:
- 增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
- 可以在运行期间获取类的属性,方法, 通过反射动态调用修改
缺点:
- 反射会对类信息类型的动态解析, 使得程序性能降低
- 由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
- 反射可以打破原有的访问权限的限制, 破坏代码的封装性
注意:
要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到
反射
一、 背景
在之前, 仅仅知道一个类名就可以得到类的信息
例如:
` 1. /
2. <select id="" resultType="">
3. mybatis里的session.getMapper(Mapper绑定的Dao接口)
在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变
有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性
二、 概念
反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息
三、. 反射
User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象
通过Class对象可以获取类里的信息
反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们
四、获取类的class对象
通过对象名获取
USer user = new User();
Class u = user.getClass();
通过类名.class获取类的Class对象
Class u2 = User.class();
通过Class.forName(“类名获取”)
Class u3 = Class.forName(“com.jwq.reflect.User”)
1、通过class对象获取构造方法对象
//获取公共的构造方法
Constructor constructor = u1.getConstructor();
Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
//获取私有的构造方法 也可以获取公共构造
Constructor constructor3 = u1.getDeclaredConstructor();
//设置对私有权限的构造方法进行操作
constructor3.setAccessible(true);
//通过构造方法来创建对象
Object user = constructor.newInstance();
Object user2 = constructor2.newInstance("Nelson",19,"男");
class对象获取属性对象
getField("指定字段)
getDeclaredFields("指定字段")
getFields()
getDeclaredFields()
可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性通过Class对象获取啊方法对象
Constructor constructor = u.getDeclaredConstructor(); constructor.setAccessible(true); Object user = constructor.newInstance(); //--------------------------------- Method setName = u.getMethod("setName", String.class); //--------------------------------- setName.invoke(user, "老铁"); // invoke(对象名,参数值)
五、反射优缺点
优点:
增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
可以在运行期间获取类的属性,方法, 通过反射动态调用修改
缺点:
反射会对类信息类型的动态解析, 使得程序性能降低
由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
反射可以打破原有的访问权限的限制, 破坏代码的封装性
注意:
要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到