Java:反射基础
2018-01-24 22:17
162 查看
Java:反射基础
引入反射
反射是什么
能够动态分析类能力的程序称为反射。反射是一种很强大且复杂的机制。
Class类
在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个对象追踪着每个对象所属的类。虚拟机利用运行时类的信息选择相应的方法执行。我们可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。
根据对象获得类信息:
MyClass myClass; ..... Class cl = myClass.getClass(); cl.getName(); //获得类名
获得Class类的另外两种方式:
1.调用静态方法forName获得类名相应的Class对象。
String className = 'java.util.Date'; Class cl = Class.forName(className);
2.直接获取
Class cl1 =Date.class; Class cl2 = Integer.class;
注意:
虚拟机为每一个类型管理一个Class对象。因此使用==可以实现两个类对象比较的操作。
利用反射分析类的能力
API函数举例
getDeclaredFields():获得此类对象所表示的类或接口所声明的所有字段。getDeclaredMethods():获得此类对象所表示的类或接口所声明的所有方法,包括公共、保护、私有但不包括继承。
getDeclaredConstructors():返回
Constructor对象的一个数组,这些对象反映此
Class对象表示的类声明的所有构造方法。
getName():获得此class所表示实体的名称。
在运行时使用反射分析对象
API函数举例
setAccessible(boolean flag):为反射对象设置可访问标志。为true使得对象的私有属性也可以被查询和设置。getField(): 返回一个
Field对象,它反映此
Class对象所表示的类或接口的指定公共成员字段。
get(Object obj):返回对象中用Field对象表示的域值。
set(Object obj,Object newValue):用一个新值设置Obj对象中的Field对象表示的域。
实例演示
![](https://images2017.cnblogs.com/blog/991470/201801/991470-20180124223221303-1453864133.png)
利用反射调用任意方法
API函数说明
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
对带有指定参数的指定对象调用由此
Method对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的
obj参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的
args数组长度可以为 0 或 null。
如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
参数:
obj- 从中调用底层方法的对象
args- 用于方法调用的参数返回:使用参数
args在
obj上指派该对象所表示方法的结果抛出:
IllegalAccessException- 如果此
Method对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。
IllegalArgumentException- 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。
InvocationTargetException- 如果底层方法抛出异常。
NullPointerException- 如果指定对象为 null,且该方法是一个实例方法。
ExceptionInInitializerError- 如果由此方法引起的初始化失败
相关文章推荐
- Java反射基础(二)--Fileds对象的使用
- java基础加强(二)(枚举与反射)
- Java反射基础
- java反射(一):反射基础
- Java基础笔记-反射及应用
- [Java]Sping基础知识-反射
- 黑马程序员-Java基础学习-反射技术
- Java基础之—反射(非常重要,写得非常好)
- JAVA基础必备(十三)——反射(二)
- Java基础之—反射(非常重要)
- 黑马程序员_java基础加强_静态导入_反射_枚举_注解_内省_泛型_代理
- Java基础学习总结(95)——Java反射主要用来干什么?
- Java基础加强反射总结
- 黑马程序员_java基础_反射
- java基础加强--eclipse工程下的.classpath文件与加载配置文件进行反射
- Java基础之反射
- 黑马程序员——Java基础——反射
- 吃透Java的反射机制——基础知识总结
- Java反射基础
- java基础加强--反射