反射reflect
Class 类
Package 包
Field 属性
Method 方法
Constructor 构造方法
Package 包
Annotation 注解,(可以放置在类/属性/方法/构造方法上面和参数的前面)
1.Class 类
1.1.获取Class的三种方式
1.1.1. Class clazz = Class.foaName(“类全名”);
Class clazz = Class.forName("java.lang.String");
1.1.2. Class clazz = 类名.class;
Class clazz1 = String.class;
1.1.3. Class clazz = 对象.getClass();//getClass()方法是Object下被继承的方法
Class clazz2 = "".getClass();
1.2.Class下的常用方法
//获取类的修饰符(权限修饰符和特征修饰符),用int类型表示每一个修饰符,返回值是所有修饰符int表示的值的和
int k = clazz.getModifiers();
//获取类的名字 [java.lang.String]
String name = clazz.getName();
//获取类的名字 [String]
String simpleName = clazz.getSimpleName();
//获取类所在的包
Package pac = clazz.getPackage();
//Package下的方法 获取包的名字
String name = pac.getName();
//获取类的超类(父类)
Class clazz = clazz.getSuperclass();
//获取类的一堆接口
Class[] clazz = clazz.getInterfaces();
//创建对象,相当于调用类中的无参数默认构造方法
Object o = clazz.newInstance();
2.Package 包
3.Field 属性
3.1.获取Field(只能获得public修饰的属性,包含继承过来的属性)
Field field = clazz.getField("属性名");
Field field = clazz.getField("Aname");
获取一堆Field(只能获得public修饰的属性,包含继承过来的属性)
Field[] fields = clazz.getFields();
获取Field(包含所有修饰符修饰的,只能获得本类中的属性)
Field field = clazz.getDeclaredField("属性名");
获取一堆Field(包含所有修饰符修饰的,只能获得本类中的属性)
Field[] fields = clazz.getDeclaredFields();
备注,获取处理public修饰符以外的其它修饰符修饰的属性时,不能设置属性值,会产生异常"IllegalArgumentException"
需要先设置属性可被操作"field.setAccessible(true);"
尝试操作String类,修改私有属性
try {
//获得String类对应的Class
Class clazz = Class.forName("java.lang.String");
//获得String类下的私有属性value
Field field = clazz.getDeclaredField("value");
//设置私有属性的可操作状态
field.setAccessible(true);
//获得对象
String str = (String)clazz.newInstance();
//属性赋值
field.set(str,new char[]{'a','b','c'});
char[] chars = (char[])field.get(str);
System.out.println(Arrays.toString(chars));
//修改数组的值
chars[0] = '1';
chars[1] = '2';
chars[2] = '3';
System.out.println(Arrays.toString((char[]) field.get(str)));
} catch (Exception e) {
e.printStackTrace();
}
3.2.Field下的常用方法
//获取属性的修饰符(权限修饰符和特征修饰符)
int k = field.getModifiers();
//获取属性的类型
Class clazz = field.getType();
//获取属性的名字
String name = field.getName();
//赋值
field.set(对象,属性值);
field.set(new Atm(),"张三");
field.set((Atm)clazz.newInstance(),"张三");
//取值
Object obj = field.get(对象);
String str = (String)field.get(new Atm());
4.Method 方法
4.1.获取方法
//可以获取自己类和父类的指定方法名字的public方法
Method method = clazz.getMethod("方法名","参数对相应的class的动态参数列表");
//获取自己类和父类的所有public方法
获取Method (只能获得public修饰的属性,包含继承过来的方法)
Method[] methods = clazz.getMethods();
获取一堆Method (只能获得public修饰的属性,包含继承过来的方法)
Method [] method = clazz.getMethod s();
获取Method (包含所有修饰符修饰的,只能获得本类中的方法)
Method method = clazz.getDeclaredMethod ("方法名");
获取一堆Method (包含所有修饰符修饰的,只能获得本类中的方法)
Method [] method = clazz.getDeclaredMethods();
备注,获取处理public修饰符以外的其它修饰符修饰的方法时,不能执行方法,会产生异常"IllegalArgumentException"
需要先设置方法可被操作"method.setAccessible(true);",然后才能执行invoke()方法
4.2.Method下的常用方法【参考手册】
方法的修饰符
方法名
方法的参数列表
方法返回值数据类型
方法的异常
方法上面的注解
调用方法执行
Object obj = method.invoke(类,参数类型);
m2.invoke((Atm)clazz.newInstance(),1);
5.Constructor 构造方法
5.1.获取构造方法
Constructor constructor = clazz.getConstructor("参数对相应的class的动态参数列表");
5.2.Constructor下的常用方法
..........
执行构造方法
Object obj = constructor.newInstance(参数);
执行Constructor的常用方法同Method的常用方法,如获取一堆,获取私有,执行私有...