围绕着Class对象和java.lang.reflect类库使用
使用反射需要先获得class类对象
反射 - 图1

2.反射基础操作

1.获取类对象的四种方式

  1. // 类名.class
  2. Class clazz = Person.class;
  3. // 对象名.getClass()
  4. Class clazz2 = new Person().getClass();
  5. // Class.forName("类的全路径名")
  6. Class clazz3 = Class.forName("com.example.demo.fashe.Person");
  7. // 通过类加载器获取类对象
  8. Class clazz4 = Demo02.class.getClassLoader().loadClass("com.example.demo.fashe.Person");

2.基本信息的操作

  1. int modifier = clazz.getModifiers(); //获取类的修饰符
  2. Package package= clazz.getPackage(); //获取类的包名
  3. String fullClassName = clazz.getName(); //获取类的全路径名称
  4. String simpleClassName = clazz.getSimpleName(); //获取类的简单名称
  5. ClassLoader classLoader = clazz.getClassLoader(); //获取类的类加载器
  6. Class[] interfacesClasses = clazz.getInterfaces(); //获取类实现的接口列表
  7. Class fc= clazz.getSuperclass(); //获取类的父类
  8. Annotation[] annotations= clazz.getAnnotations(); //获取类的注解列表
  9. ...

3.类的属性操作

  1. Field[] fields = clazz.getFields(); //获取类中所有的公有字段 包含继承
  2. Field[] declaredFields=clazz.getDeclaredFields(); //获取类中定义的字段 内部
  3. Field nameField=clazz.getField("name"); //获取指定名称的公有字段
  4. Field likeDescField=clazz.getDeclaredField("likeDesc"); //获取指定名称类中定义的字段
  5. int modifersFiled = likeDescField.getModifiers(); //获取字段的修饰
  6. nameField.setAccessible(true); //指定字段强制访问
  7. nameField.set(person,"小皮皮"); //成员字段赋值(需指定对象)
  8. descriptionField.set(null,"没有结婚的都是男孩!"); //静态字段赋值
  9. ....

4.方法的操作

  1. Method[] methods = clazz.getMethods(); //获取类中所有的公有方法 继承
  2. Method[] declaredMethods = clazz.getDeclaredMethods(); //获取类中定义的方法
  3. Method talkMethod = clazz.getMethod("talk"
  4. , String.class); //获取类中指定名称和参数的公有方法
  5. Method pugMethod = clazz.getDeclaredMethod("pickUpGirls") //获取类中定义指定名称和参数的方法
  6. int modifers = pugMethod .getModifiers(); //获取方法的修饰符
  7. talkMethod.invoke(boy,"I LOVE SEVEN"); //指定对象进行成员方法的调用
  8. pugMethod .setAccessible(true); //指定方法的强制访问
  9. pickUpGirlsMethod.invoke(null); //静态方法的调用
  10. ...

5.构造器的操作

  1. Constructor[] cons = clazz.getConstructors(); //获取类中所有的公有构造器
  2. Constructor[] cons = clazz.getDeclaredConstructors(); //获取类中所有的构造器
  3. Constructor conNoParam= clazz.getDeclaredConstructor(); //获取类中无参的构造器
  4. Constructor con= clazz.getDeclaredConstructor(String.class,String.class); //获取类中有参构造
  5. int modifers = con.getModifiers(); //获取构造器的修饰符
  6. conNoParam.newInstance(); //构造器实例对象
  7. con.setAccessible(true); //指定方法的强制访问
  8. con.newInstance('abc','def'); //有参构造调用
  9. class.newInstacne(); //class直接调用默认无参构造