反射是后续web框架学习的基础!
1. 概念
Java的反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制。亦即动态获取类中的信息,可以理解为对类的解剖。
2. Class类
在程序运行期间,Java运行时始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪着每个对象所属的类,保存这些信息的类被称为Class。
2.1 Class对象的获取
Random r = new Random();
Class clazz = r.getClass();
-------------------------------------------
String className = "java.util.Random";
Class clazz = Class.forName(className);
-------------------------------------------
Class clazz = Random.class; //if you import java.util.*;
2.2 Class类的相关方法:
public String getName(); 获取Class对象的类名。
示例:
Random r = new Random(); Class clazz = r.getClass(); String name = clazz.getName(); //name is set to "java.util.Random"
public Object newInstance(); //返回这个类的一个新实例(构造方法为空参)。
示例: String s = "java.util.Random"; Object obj = Class.forName(s).newInstance(); Random r = (Random)obj;
3. Field类
该类用于描述类的属性(域)
3.1 Field对象的获取
- Filed[] getFields();
返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域。
- Field[] getDeclaredFields();
返回一个包含Field对象的数组,这些对象记录了这个类的全部域
- Filed getFiled(String name);
获取指定名称的公有域
3.2 Filed类的相关方法
- Class getType();
返回Filed对象的类型所对应的Class对象。比如有属性定义:String name = “zzz”;那么该方法返回的即为字符串name所对应的Class对象。
- int getModifiers();
返回一个用于描述构造器、方法或域的修饰符的整型数值。可以使用Modifier类中的静态方法toString(int modifilerNum)来显示该数值所对应的修饰符。
3.3 Field类的对象域值
- Object get(Object obj);
返回Object对象中用Field对象表示的域值。如果是类中的属性是基本数据类型则返回对应的包装类。
- void set(Object obj, Object newValue);
用一个新值设置Obj对象的中Field对象表示的域
- void setAccessible(Boolean falg);
类中的私有属性是不可以通过get(Object obj)方法获取到的。该方法为反射对象设置可访问标志。flag为true表明屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。
- static void setAccessible(Fileds[] fields, boolean flag);
fields为需要设置访问标志的字段对应的Filed对象,该方法时设置对象数组可访问标志的快捷方法。
4. Method类
4.1 Method对象的获取
Method getMethod(String name, Class… parameterTypes);
第一个参数为方法名,第二个参数为该方法的参数的类型
示例:
比如存在一个类Person,有一个void eat(String foodName);方法。
那么可以使用getMethod方法获取Person类的eat方法的Method对象。
Method eatMethod = Person.class.getMethod(“eat”, String.class);Method getMethod(String name);
通过方法名去获取Method对象。
Method[] getMethod();
返回所有的公有方法,包括从超类继承来的公有方法。
Method[] getDeclaredMethod();
返回这个类或接口的全部方法,但不包括由超类继承了的方法。
4.2 Method类的相关方法
Class getReturnType();
返回一个用于描述返回类型的Class对象。
Class[] getParameterTypes();
返回一个用于描述参数类型的Class对象数组。
Object invoke(Object implictParameter, Object[] explicitParamemters);
调用这个对象所描述的方法,传递给定参数,并返回方法的返回值。第一个参数为调用该方法的对象,第二个参数为该方法需要传入的参数值。对于静态方法。把null作为隐式参数传递。在使用包装器传递基本类型的值时,基本类型的返回值必须是未包装的。
5. Constructor类
5.1 Constructor对象的获取
Constructor[] getConstrcutors();
返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有公有构造器
Constructor[] getDeclaredConstrcutors();
返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有构造器
5.2 Constructor类的相关方法
Object newInstance(Object[] args);
构造一个这个构造器所属类的新实例。数组参数若有基本数据类型,需传入对应的包装类。