1. 反射的概述
- 反射是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。
- 由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
2. 获取Class类对象的三种方式
2.1 三种方式
类名.class属性
对象名.getClass()方法
Class.forName(全类名)方法
2.2 示例代码
class People {
}
public class Demo {
public static void main(String[] args) throws ClassNotFoundException{
Class<People> p1 = People.class;
System.out.println(p1);
Class<People> p2 = People.class;
System.out.println(p1 == p2);
People p3 = new People();
Class<? extends People> p4 = p3.getClass();
System.out.println(p1 == p4);
Class<?> p5 = Class.forName("People");
System.out.println(p1 == p5);
}
}
3. 反射获取构造方法并使用
3.1 Class类获取构造方法对象的方法
1. 方法分类
方法名 |
说明 |
Constructor >[] getConstructors() |
返回所有公共构造方法对象的数组 |
Constructor >[] getDeclaredConstructors() |
返回所有构造方法对象的数组 |
Constructor getConstructor(Class >… parameterTypes) |
返回单个公共构造方法对象 |
Constructor getDeclaredConstructor(Class >… parameterTypes) |
返回单个构造方法对象 |
2. 示例代码
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class People {
public People(){
}
}
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodError, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
Class<?> c = Class.forName("People");
Constructor<?>[] cons = c.getDeclaredConstructors();
for(Constructor con : cons) {
System.out.println(con);
}
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);
}
}
3.2 Constructor类用于创建对象的方法
方法名 |
说明 |
T newInstance(Object…initargs) |
根据指定的构造方法创建对象 |
4. 反射获取成员变量并使用
4.1 Class类获取成员变量对象的方法
1. 方法分类
方法名 |
说明 |
Field[] getFields() |
返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() |
返回所有成员变量对象的数组 |
Field getField(String name) |
返回单个公共成员变量对象 |
Field getDeclaredField(String name) |
返回单个成员变量对象 |
2. 示例代码
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
class People{
public People() {
}
public String address;
}
public class Demo {
public static void main(String[] args) throws ClassNotFoundException,
NoSuchFieldException, NoSuchMethodException, IllegalAccessException,
InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("People");
Field[] fields = c.getDeclaredFields();
for(Field field : fields) {
System.out.println(field);
}
Field addressField = c.getField("address");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
addressField.set(obj,"安徽");
System.out.println(obj);
}
}
4.2 Field类用于给成员变量赋值的方法
方法名 |
说明 |
voidset(Object obj,Object value) |
给obj对象的成员变量赋值为value |
5. 反射获取成员方法并使用
5.1 Class类获取成员方法对象的方法
1. 方法分类
方法名 |
说明 |
Method[] getMethods() |
返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() |
返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class>… parameterTypes) |
返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class>… parameterTypes) |
返回单个成员方法对象 |
5.2 Method类用于执行方法的方法
方法名 |
说明 |
Objectinvoke(Object obj,Object… args) |
调用obj对象的成员方法,参数是args,返回值是Object类型 |
暂无评论内容