反射机制概述
1. 反射机制定义
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
2. 反射机制实现功能概述
1)只要给定类的全路径,即可通过反射获取类的所有信息
2)反射可以在程序运行时获取任意一个对象所属的类对象
3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)
4)在运行时可以获取到类中、父类中所有方法,并调用
5)目前主流的应用框架如Struts2,Hibernate,Spring,SpringMVC等框架的核心全部是利用Java的反射机制来实现的。
Class对象概述
- Class(java.lang.Class)是什么?
Java在将.class字节码文件载入时,JVM将产生一个java.lang.Class对象代表该.class字节码文件,从该Class对象中可以获得类的许多基本信息,这就是反射机制。所以要想完成反射操作,就必须首先认识Class类。
需要注意的是:
1)通过Class类的对象,可以知道他所描述的类的信息;
2)Class不是所有类的父类(是Object);
2. Class对象的常用方法介绍
方法名 | 释义 |
getName() | 获得类的完整名称 |
getDeclaredFields() | 获得类中的所有属性,而getFields()只能获取到公有属性 |
getDeclaredField(“fieldName”) | 根据变量名,获取类中的变量 |
getDeclaredMethods() | 获得类中的所有方法,而getMethods()只能获取到公有方法 |
getConstructors() | 获得类的构造方法 |
newInstance() | 实例化对象,调用这个方法要求该类必须具有无参构造方法 |
getMethod(String name,parameterType.class,... ) | 根据方法名,获得方法对象,同getDeclaredMethods() (方法名,参数类1.class,参数类2.class.....) |
3. 获取Class对象
方法一:
Class c = Class.forName("w6.Car"); //Class类的静态方法forName(“完整的包名+类名”)
方法二:
Book book = new Book();
Class c = book.getClass();
方法三:
Class c = Book.class;
//通过类对象获得实例对象
Book book = (Book) c.newInstance();
Field对象的机制与实现
1. Field对象概述
1)Java.lang.reflect.Field类中、接口中属性对象的类。
2)可以操作类中私有,以及公有等全部属性和属性的信息。
2. Field对象的常用方法
方法名 | 释义 |
getName() | 获得属性名称 |
getType() | 获得属性类型 |
get(Object obj) | 取得obj对象中这个属性的值 |
set(Object obj,Object value) | 向obj对象中这个属性赋值value |
setAccessible(true) | 启用/禁用访问控制权限,开启或关闭私有属性的访问权限 |
注意:私有属性不能用get(Object obj)直接访问到属性值,必须在调用get(Object obj)之前开启访问权限,即调用setAccessible(true)
Method对象的机制与实现
1. Method对象概述
1)java.lang.reflect.Method类是用于表示类中、接口中方法对象的类
2)可以操作类中私有以及公有等全部方法
2. Method对象的常用方法介绍
方法名 | 释义 |
getName() | 获得方法名称 |
getReturnType() | 获得方法返回值类型 |
invoke(Object obj,Object parameter,...) | 调用obj对象的该方法 |
getParameterTypes() | 获得方法所有参数类型,按照类中参数顺序返回Class数组 |
getDeclaredAnnotations | 获取方法的全部注解 |
getModeifiers() | 返回方法的修饰符(如:static、final等) |
示例:
Class cls = Class.forName("com.card.charge.deal.HDL");
//获取某一个方法
//getDeclaredMethod(方法名,参数类型,参数类型)
Method method = cls.getMethod("run",String.class);
//执行一个方法
//newInstance()创建一个类的对象,这里有String res接收,表示该方法有返回值
//null表示该方法没有入参
String res = (String) method.invoke(cls.newInstance(),null);
Class对象的三种获取方式
Class类的对象无法实例化,其构造方法是私有的。
序号 | 方式 |
1 | 通过对象的getClass()方法获取Class对象。 |
2 | 通过类名.class 获取Class对象。 |
3 | 通过Class.forname(“全限定类名”)。 |