十二, 反射
1. 初识反射
-
反射定义: 反射允许对成员变量, 成员方法, 构造方法的信息进行编程访问
-
IDEA中的查看传参类型以及.自动补全方法等都是反射的思想
-
使用反射: 获取和解剖
-
反射的作用:
- 获取一个类里面的所有信息, 获取到了之后, 再执行其他的业务逻辑
- 结合配置文件, 动态的创建对象并调用方法


2. 获取

2.1 获取class对象的三种方式 Class

package awei.itheima;
public class MyRefletDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
// 1. 第一种方式
// 全类名: 包名 + 类名
// 最为常用
Class clazz = Class.forName("awei.itheima.Phone");
System.out.println(clazz);
// 2. 第二种方式
// 更多是当参数, 比如锁的使用
Class clazz1 = Phone.class;
System.out.println(clazz1);
// 3. 第三种方式
// 创建对象
Phone phone = new Phone();
Class clazz2 = phone.getClass();
System.out.println(clazz2);
if(clazz == clazz1 && clazz1 == clazz2) {
System.out.println("相同");
}
}
}
2.2 获取构造方法 Constructor

package awei.itheima.Myreflect2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 1. 获取class字节码文件对象
Class clazz = Class.forName("awei.itheima.Myreflect2.Student");
// 2. 获取构造方法(public)
Constructor[] constructors = clazz.getConstructors();
for (Constructor c : constructors) {
System.out.println(c);
}
// 3. 获取所有构造方法(包括私有)
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor c : declaredConstructors) {
System.out.println(c);
}
// 4. 获取指定构造方法
Constructor constructor = clazz.getConstructor(String.class);
System.out.println(constructor);
Constructor constructor1 = clazz.getDeclaredConstructor(String.class, int.class);
System.out.println(constructor1);
// 5. 获取权限修饰符
int modifiers = constructor1.getModifiers();
System.out.println(modifiers);
//6. 获取参数
Parameter[] parameters = constructor1.getParameters();
for (Parameter p : parameters) {
System.out.println(p);
}
// 7. 创建对象
// 对于私有构造要临时取消权限校验
constructor1.setAccessible(true);
Student student = (Student) constructor1.newInstance("张三", 18);
System.out.println(student);
}
}
2.3 字段(成员变量) Field



2.4 成员方法 Method

package awei.itheima.MyReflect3;
import java.lang.reflect.Method;
public class MyRefletDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
// 1. 文件对象
Class clazz = Class.forName("awei.itheima.MyReflect3.Student");
// 2. 获取里面所有的方法对象(包括父类中的公共方法)
// Method[] methods = clazz.getMethods();
// for (Method method : methods) {
// System.out.println(method);
// }
// 3. 获取所有方法对象(包括私有), 但不获取父类的
// System.out.println("--------------------------------");
// Method[] declaredMethods = clazz.getDeclaredMethods();
// for (Method method : declaredMethods) {
// System.out.println(method);
// }
Method method = clazz.getDeclaredMethod("eat", String.class);
System.out.println(method);
}
}


浙公网安备 33010602011771号