1、反射
1.1 反射的概述
- 是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
1.2 获取Class类对象的三种方式
1.2.1三种方式分类
- 类名.class属性
- 对象名.getClass()方法
- Class.forName(全类名)方法
1.2.2 示例代码
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
Class<Student> c1 = Student.class;
System.out.println(c1);
Class<Student> c2 = Student.class;
System.out.println(c1 == c2);
System.out.println("--------");
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c1 == c3);
System.out.println("--------");
Class<?> c4 = Class.forName("test02.Student");
System.out.println(c1 == c4);
}
}
1.3 反射获取构造方法并使用
1.3.1 Class类获取构造方法对象的方法
方法名 | 说明 |
---|
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor getConstructor(Class<?>… parameterTypes) | 返回单个公共构造方法对象 |
Constructor getDeclaredConstructor(Class<?>… parameterTypes) | 返回单个构造方法对象 |
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("test02.Student");
Constructor<?>[] cons = c.getDeclaredConstructors();
for(Constructor con : cons) {
System.out.println(con);
}
System.out.println("--------");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);
}
}
1.3.2 Constructor类用于创建对象的方法
方法名 | 说明 |
---|
T newInstance(Object…initargs) | 根据指定的构造方法创建对象 |
1.4 反射获取成员变量并使用
1.4.1 Class类获取成员变量对象的方法
方法名 | 说明 |
---|
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
public class ReflectDemo01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c = Class.forName("test02.Student");
Field[] fields = c.getDeclaredFields();
for(Field field : fields) {
System.out.println(field);
}
System.out.println("--------");
Field addressField = c.getField("address");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
addressField.set(obj,"广西");
System.out.println(obj);
}
}
1.4.2 Field类用于给成员变量赋值的方法
方法名 | 说明 |
---|
voidset(Object obj,Object value) | 给obj对象的成员变量赋值为value |
1.5 反射获取成员方法并使用
1.5.1 Class类获取成员方法对象的方法
方法名 | 说明 |
---|
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>… parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>… parameterTypes) | 返回单个成员方法对象 |
public class ReflectDemo01 {
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("test02.Student");
Method[] methods = c.getDeclaredMethods();
for(Method method : methods) {
System.out.println(method);
}
System.out.println("--------");
Method m = c.getMethod("method1");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
m.invoke(obj);
}
}
1.5.2 Method类用于执行方法的方法
方法名 | 说明 |
---|
Objectinvoke(Object obj,Object… args) | 调用obj对象的成员方法,参数是args,返回值是Object类型 |