反射
Java发射机制是指在运行状态下,对于任意一个类,都可以得到其方法与属性。
发射机制的相关类
| 类名 |
用途 |
| Class类 |
代表类的实体,在运行的Java应用程序中表示类和接口 |
| Field类 |
代表类的成员变量(成员变量也称为类的属性) |
| Method类 |
代表类的方法 |
| Constructor类 |
代表类的构造方法 |
class类
| 获取方法 |
代码实现 |
| 1 通过实例化对象getClass()获取 |
Class cl = new D().getClass(); |
| 2 通过Class.forName()获取 |
Class cl = Class.forName("practice.D"); |
| 3 直接使用对象.class文件 |
Class cl = D.class;l |
| 方法 |
用途 |
| newInstance() |
实例化对象 |
| 方法 |
用途 |
| getField(String name) |
获得某个公有的属性对象 |
| getFields() |
获得所有公有的属性对象 |
| getDeclaredField(String name) |
获得某个属性对象 |
| getDeclaredFields() |
获得所有属性对象 |
对属性的操作:
fields[1].getName() //获取属性名称
fields[1].getType().getSimpleName() //获取属性类型名称
int i = fields[1].getModifiers();
String modify = Modifier.toString(i); //获取修饰符
fields[0].set(d,111); //修改值,前提是该类已实例化并且不是private修饰,若是private修饰需要提前打破封装
fields[1].setAccessible(true); //打破封装
public static void main(String[] args) throws Exception {
Class c = Class.forName("practice1.D");
D d = (D) c.newInstance();
System.out.println(d.a);
Field[] fields = c.getDeclaredFields();
fields[0].set(d,111);
fields[1].setAccessible(true);
fields[1].set(d,222);
System.out.println(d.a);
}
| 方法 |
用途 |
| getAnnotation(Class annotationClass) |
返回该类中与参数类型匹配的公有注解对象 |
| getAnnotations() |
返回该类所有的公有注解对象 |
| getDeclaredAnnotation(Class annotationClass) |
返回该类中与参数类型匹配的所有注解对象 |
| getDeclaredAnnotations() |
返回该类所有的注解对象 |
| 方法 |
用途 |
| getMethod(String name, Class...<?> parameterTypes) |
获得该类某个公有的方法 |
| getMethods() |
获得该类所有公有的方法 |
| getDeclaredMethod(String name, Class...<?> parameterTypes) |
获得该类某个方法 |
| getDeclaredMethods() |
获得该类所有方法 |
对方法的操作
Method method = c.getDeclaredMethod("play", int.class);
method.invoke(d,3);
| 方法 |
用途 |
| getConstructor(Class...<?> parameterTypes) |
获得该类中与参数类型匹配的公有构造方法 |
| getConstructors() |
获得该类的所有公有构造方法 |
| getDeclaredConstructor(Class...<?> parameterTypes) |
获得该类中与参数类型匹配的构造方法 |
| getDeclaredConstructors() |
获得该类所有构造方法 |