0. 优质博客

  1. Java反射(超详细!)
  2. Java学习之反射机制及应用场景介绍(代码可复制)

    1. 反射基础

    1.1 概述

    Java程序在运行时操作类中的属性和方法的机制,称为反射机制;
    Reflection是Java被视为动态(或准动态)语言的一个关键性质。
    作用:

  3. 反编译:.class —> .java。

  4. 通过反射机制运行时访问Java对象中的属性、方法、构造方法等。
    1. //Class类和String类都是被final关键字修饰的类,是不可以被继承的类;
    2. //Class类支持泛型T,也就是说在编写程序时可以做到:反射 + 泛型;
    3. //Class类实现了序列化标记接口Serializable,既是Class类可以被序列化和反序列化;
    4. //Class类不能被继承,同时唯一的一个构造器还是私有的,因为设计之初就是让JVM在类加载后传入ClassLoader对象来创建 Class对象(每个类或接口对应一个JVM自动生成Class对象),开发人员只是调用Class对象,并没有直接实例化Class的能力
    5. public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement {
    6. private final ClassLoader classLoader;
    7. private Class(ClassLoader loader) {
    8. classLoader = loader;
    9. }
    10. }
    image.png

    1.2 获取Class的3种方式

    | 方式 | 备注 | | —- | —- | | Class.forName(“完整类名带包名”) | 返回值都是Class类型。静态方法 | | 对象.getClass() | 返回值都是Class类型。 | | 任何类型.class | 返回值都是Class类型。 |
  1. java.lang.Class; //类
  2. java.lang.reflect.Constructor;//构造方法
  3. java.lang.reflect.Field; //类的成员变量
  4. java.lang.reflect.Method;//类的方法
  5. java.lang.reflect.Modifier;//访问权限

1.3 反射常用方法

  1. getDeclaredConstructors();     //获取所有的构造函数
  2. getDeclaredConstructor(参数类型);  //获取一个所有的构造函数
  3. getConstructors();          //获取所有公开的构造函数
  4. getConstructor(参数类型);      //获取单个公开的构造函数
  5. getName();     //获取全名 例如:com.bean.Book
  6. getSimpleName()   //获取类名 例如:Book
  7. getPackage(); //获取包,返回类型:package
  8. getInterfaces(); // 获取实现接口,返回类型:Class[] interfaces
  9. getSuperclass(); //获取父类/超类,返回类型:Class superclass
  10. getMethods();   //获取所有公开的方法,注意:它会将系统自带的方法也得到
  11. getMethod(String name);    //获取单个公开的方法,参数是可以指定方法名
  12. getDeclaredMethods()    //获取所有的方法,注意:它不会获取系统自带的方法
  13. getDeclaredMethod(String name)     //获取单个的所有方法 参数是可指定方法名
  14. getFields()    //获取所有的公开字段
  15. getField(String name)   //参数可以指定字段  获取单个public字段
  16. getDeclaredFields()   //获取所有的字段
  17. getDeclaredField(String name)   //获取单个字段 参数可以指定字段
  18. /**获取所有修饰符,返回类型:整数类型,如果有两个修饰符,则返回两个修饰符之和,
  19. 例如public static void getAll(){ }返回值会是public和static之和*/ 
  20. /*整数定义:
  21. 0–默认不写/1–public/2–private/4–protected/8–static/16–final/
  22. 32–synchronized/64–volatile/128–transient/
  23. 256–native/512–interface/1024–abstract*/
  24. getModifiers();
  1. //第一种方法:newInstance()
  2. Class clz = Book.class;
  3. Object obj = clz.newInstance(); //将创建一个无参book对象
  4. //第二种方法:构造函数
  5. Class clz = Book.class;
  6. Constructor constructor = clz.getDeclaredConstructor(); //获得无参构造
  7. Object obj = constructor.newInstance(); //实例化book对象
  1. //利用setAccessible操作私有成员变量、方法
  2. clz.setAccessible(true)  //可访问
  3. clz.setAccessible(false)  //不可访问
  4. //默认是false
  5. Field id = clz.getField("age"); //age字段  
  6. id.setAccessible(true); //设为可访问
  7. id.setAccessible(false); //设为不可访问
  1. //method.invoke(Object obj,Object... args)
  2. //obj:如果是实例方法,则放个该方法的类对象给它;如果是静态方法,写null
  3. //args:方法的参数值,没有写null,或不写都行
  4. Method method = clz.getMethod("printAll"); //获取单个的公开方法
  5. method.invoke(clz.newInstance(),null); //使用方法

2. 反射实战(框架底层开发)

2.1 反射-注解

2.2 反射-泛型

2.3 反射-JDK动态代理

2.4 反射-配置文件