反射机制

1. 反射的基本概念:

主要是指程序可以访问、检测和修改它本身状态或行为的一种能力, 并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
Java中,反射是一种强大的工具。它能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。

2. 反射的用途:

1)反编译:.class–>.java
2)通过反射机制访问java对象的属性,方法,构造方法等
3)当我们在使用IDE,比如Ecplise时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。
4)反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。

3. 反射的优缺点:

优点:
在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:
1)反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
2)反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

4. 构造Class对象的3种方式

1)Class c = Class.forName(“完整类名”)
2)Class c = 类.class
3)Class c = Object.getClass()
文中的c均代表已创建的Class对象
三种方式中,常用第一种,第三种对象都有了还要反射干什么,第二种需要导入类包,依赖太强,不导包就抛编译错误。一般都使用第一种,一个字符串可以传入也可以写在配置文件中等多种方法。

5. 利用Class文件获取类和对象的反射信息

1)属性Field
Field[] fs = c.getFields() 返回包含共有属性的数组
Field f = c.getField(String name) 返回指定名称的共有属性
Field[] fs = c.getDeclareFields() 返回包含所有属性的数组
Field f = c.getDeclareField(String name) 返回指定名称的属性
获取到属性后,可以通过调用getName()获取属性名称,getType()获取属性类型。

2)方法Method
Method[] ms = c.getMethods() 返回包含共有方法的数组
Method m = c.getMethod(String name, Class… parameterTypes)
Method[] ms = c.getDeclaredMethods() 返回包含所有方法的数组
Method m = c.getDeclaredMethod(String name, Class… parameterTypes) 返回指定方法名,形式参数列表的方法。
如:Method m = c.getDeclaredMethod(String name, String.class, int.class, double.class)
获取到方法后,可以通过getName()获取方法名称,getModifiers()获取修饰符对应的int值(可通过Modifier.toString()转换为名称),getReturnType()获取返回值类型(返回的是Class全称,可以通过调用.getSimpleName()获取简称),getParameterTypes()获取参数列表(参数不止一个,所以返回的是一个Class[])

3)构造方法Constructor
Constructor[] constructors = c.getConstructor()
Constructor constructor = c.getConstructor(Class… parameterTypes)
Constructor[] constructors = c.getDeclaredConstructor()
Constructor constructor = c.getDeclaredConstructor(Class… parameterTypes)

此块内容主要调用的是Class类中的方法来获取相应的Field,Method,Constructor。

6. 反射机制创建对象

1)c.newInstance() 直接调用类的无参构造方法,此方法自JDK9之后弃用
2)先获取构造方法
Constructor constructor = c.getDeclaredConstructor(Class… parameterTypes)
再创建对象
Object newObj = constructor.newInstance(Object… parameters)
调用无参构造也采用同样的方法,只不过不传参数。

7. 通过反射机制访问一个对象的属性(set() and get())

不使用反射机制访问对象属性:
Student stu = new Student();
String name = stu.name;
两要素:对象stu,name属性
反射机制访问:
1)创建对象
Class c = Class.forname(“类名地址”);
Constructor con = c.getDeclaredConstructor(Class… parameterTypes);
Object obj = con.newInstance(Object… parameters);
2) 获取属性
Field fname = c.getDeclaredField(“name”);
3) 访问
fname.get(obj);
4) 赋值
fname.set(obj, “zhangsan”);

8. 通过反射机制调用实例方法(重点***)**

不使用反射机制调用实例方法:
Student stu = new Student();
String s = stu.study(“math”);
四要素:对象stu,方法名study,实参列表"math",返回值String s
反射机制调用实例方法:
1)创建对象
Class c = Class.forname(“类名地址”);
Constructor con = c.getDeclaredConstructor(Class… parameterTypes);
Object obj = con.newInstance(Object… parameters);
2)获取方法
Method m = c.getDeclaredMethod(Class… parameterTypes);
3) 调用(invoke)方法
Object retValue = m.invoke(obj, parameter);
四要素:对象obj,方法名m,实参列表parameter,返回值Object retValue

参考链接:https://blog.csdn.net/a745233700/article/details/82893076

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值