围绕着Class对象和java.lang.reflect类库使用
使用反射需要先获得class类对象
2.反射基础操作
1.获取类对象的四种方式
// 类名.class
Class clazz = Person.class;
// 对象名.getClass()
Class clazz2 = new Person().getClass();
// Class.forName("类的全路径名")
Class clazz3 = Class.forName("com.example.demo.fashe.Person");
// 通过类加载器获取类对象
Class clazz4 = Demo02.class.getClassLoader().loadClass("com.example.demo.fashe.Person");
2.基本信息的操作
int modifier = clazz.getModifiers(); //获取类的修饰符
Package package= clazz.getPackage(); //获取类的包名
String fullClassName = clazz.getName(); //获取类的全路径名称
String simpleClassName = clazz.getSimpleName(); //获取类的简单名称
ClassLoader classLoader = clazz.getClassLoader(); //获取类的类加载器
Class[] interfacesClasses = clazz.getInterfaces(); //获取类实现的接口列表
Class fc= clazz.getSuperclass(); //获取类的父类
Annotation[] annotations= clazz.getAnnotations(); //获取类的注解列表
...
3.类的属性操作
Field[] fields = clazz.getFields(); //获取类中所有的公有字段 包含继承
Field[] declaredFields=clazz.getDeclaredFields(); //获取类中定义的字段 内部
Field nameField=clazz.getField("name"); //获取指定名称的公有字段
Field likeDescField=clazz.getDeclaredField("likeDesc"); //获取指定名称类中定义的字段
int modifersFiled = likeDescField.getModifiers(); //获取字段的修饰
nameField.setAccessible(true); //指定字段强制访问
nameField.set(person,"小皮皮"); //成员字段赋值(需指定对象)
descriptionField.set(null,"没有结婚的都是男孩!"); //静态字段赋值
....
4.方法的操作
Method[] methods = clazz.getMethods(); //获取类中所有的公有方法 继承
Method[] declaredMethods = clazz.getDeclaredMethods(); //获取类中定义的方法
Method talkMethod = clazz.getMethod("talk"
, String.class); //获取类中指定名称和参数的公有方法
Method pugMethod = clazz.getDeclaredMethod("pickUpGirls") //获取类中定义指定名称和参数的方法
int modifers = pugMethod .getModifiers(); //获取方法的修饰符
talkMethod.invoke(boy,"I LOVE SEVEN"); //指定对象进行成员方法的调用
pugMethod .setAccessible(true); //指定方法的强制访问
pickUpGirlsMethod.invoke(null); //静态方法的调用
...
5.构造器的操作
Constructor[] cons = clazz.getConstructors(); //获取类中所有的公有构造器
Constructor[] cons = clazz.getDeclaredConstructors(); //获取类中所有的构造器
Constructor conNoParam= clazz.getDeclaredConstructor(); //获取类中无参的构造器
Constructor con= clazz.getDeclaredConstructor(String.class,String.class); //获取类中有参构造
int modifers = con.getModifiers(); //获取构造器的修饰符
conNoParam.newInstance(); //构造器实例对象
con.setAccessible(true); //指定方法的强制访问
con.newInstance('abc','def'); //有参构造调用
class.newInstacne(); //class直接调用默认无参构造