# 反射机制
Java 的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用方法的功能称为 java 语言的反射机制。
# java 反射机制的作用
- 用来编写一些通用性较高的代码或者框架的时候使用
# 反射常用对象
- Class:Class 类的实例表示正在运行的 Java 应用程序中的类和接口(类的字节码文件被加载到内存所形成的一个对象)
- Constructor:关于类的单个构造方法的信息以及对它的访问权限
- Field:提供有关类或接口的单个字段的信息以及对它的动态访问权限
- Method:提供关于类或接口上单独某个方法的信息
# Class 类
- Java 中 java.lang.Class 类用于表示一个类的字节码(.class)文件
- 如何得到某个 class 文件对应的 Class 对象
- 已知类和对象的情况下
类名.class
对象.getClass() -- Object 类提供 - 未知类和对象的情况下
Class.forName("包名.类名")
- 已知类和对象的情况下
- Class 类代表某个类的字节码并提供了加载字节码的方法:forName("包名.类名"),forName 方法用于加载类字节码到内存并封装成一个 Class 对象
Class clazz1 = Person.class;
Person person = new Person();
Class clazz2 = person.getClass();
Class clazz3 = Class.forName("com.reflect.Person");
# Constructor 类
- Constructor 类的实例对象代表类的一个构造方法
- 得到某个类所有的构造方法
Constructor[] constructors = Class.forName("java.lang.String").getConstructors(); - 得到指定的构造方法并调用
Constructor constructor = Class.forName("java.lang.String").getConstructor(String.class);
String str = (String)constructor.newInstance("abc"); - Class 类的 newInstance()方法用来调用类的默认构造方法
String obj = (String)Class.forName("java.lang.String").newInstance();
Class class1 = Class.forName("com.reflect.Person");
Constructor c = class1.getConstructor(); // 获得默认构造
Person person = (Person)c.newInstance(); // 相当于 new Person()
person.eat();
Constructor c1 = class1.getConstructor(String.class, String.class);
Person person1 = (Person)c1.newInstance("张三", "男"); // 相当于 new Person("张三","男")
System.out.println(person);
# Field 类
- Field 类代表某个类中的一个成员变量并提供动态的访问权限
- Field 对象的获得
- 得到所有的成员变量
Field[] fields = c.getFields(); // 取得所有 public 属性(包括父类继承)
Field[] fields = c.getDeclaredFields(); // 取得所有声明的属性(包括私有属性) - 得到指定的成员变量
Field name = c.getField("name");
Field name = c.getDeclaredField("name");
- 得到所有的成员变量
- 设置 Field 变量是否可以访问
field.setAccessible(boolean); - Field 变量值得读取和设置
field.get(obj);
field.set(obj,value);
Class class1 = Class.forName("com.reflect.Person");
Field field = class1.getField("name");
Person p = (Person)class1.newInstance();
field.set(p, "李四"); // p.name = "李四";
Object obj = field.get(p);
System.out.println(obj);
Field field1 = class1.getDeclaredField("sex");
// 私有属性需要设置可访问权限
field1.setAccessible(true);
field1.set(p, "男");
Object obj = field1.get(p);
# Method 类
- Method 类代表某个类中的一个成员方法
- Method 对象的获得
- 获得所有方法
getMethods()
getDeclaredMethods() - 获得指定方法
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethod(String name, Class<?>... parameterTypes)
- 获得所有方法
- 通过反射执行方法
invoke(Object obj, Object... args)
Class class1 = Class.forName("com.reflect.Person");
Person person = (Person)class1.newInstance();
Method method = class1.getMethod("eat");
method.invoke(person); // person.eat()
Method method1 = class1.getDeclaredMethod("run");
method.setAccessible(true);
method.invoke(person);
Method method2 = class1.getMethod("sayHello", String.class);
method2.setAccessible(true);
Object obj = method2.invoke(person, "Tom");
← 代理模式与AOP开发 基本语法 →