反射
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() |
获得该类所有构造方法 |