反射

指程序可以访问、检测和修改它本身状态或行为的一种能力
Java 通过字节码反射出类中的信息,包含:类、属性、方法、构造、继承、实现
在 JDK 中java.lang包与java.lang.reflect包下

一. Class 类

在反射中 Class 代表一个类,也叫类类型,是 Java 数据类型中的一种
创建方式
  1. Class.forName("完整路径")

  2. 类名.class

  3. 对象名.getClass()

常用方法
  1. getName():获取类的完整路径

  2. getSimpleName():获取类的名称

  3. newInstance():创建类的新实例,就是新对象

二. Java 中的数据类型()

  1. 基本数据类型(8种)

  2. 引用类型(数组和对象)

  3. 枚举

  4. 类类型

三. Java 中创建对象方式()

  1. new关键字

  2. 反序列化

  3. 反射

  4. 克隆

四. Constructor

在 Java 反射中 Constructor 的一个实例代表一个类的构造方法,可以通过类类型获取

创建方式
  1. class对象.getConstructors():获取所有的构造方法,返回一个构造方法数组

  2. class对象.getConstructor():获取指定构造方法

常用方法
  1. getName():获取构造方法的名称

  2. getParameterTypes():获取构造方法参数列表

  3. getModefiers():获取构造方法访问修饰符

  4. getExceptionTypes():获取构造方法的异常

  5. newInstance():根据指定的构造方法创建对象

五. Filed

在 Java 反射中 Filed 一个实例代表一个类中的属性

创建方式
  1. getDeclaredFields():获取本类中的所有属性,返回一个属性数组

  2. getDeclaredField(String name):根据名称获取本类中的单个属性

  3. getFields():获取父类、父接口中所有的 public 修饰的属性

  4. getField(String name):根据名称获取父类,父接口中的 public 修饰的属性

常用方法
  1. getName():获取属性名称

  2. getModifiers():获取属性访问修饰符

  3. getType():获取属性数据类型

  4. setAccessible(boolean b):设置私有变量的访问权限,默认为 false

  5. set(Object obj, Object value):给属性赋值

  6. get(Objuct obj):获取属性值

  7. getModifiers():获取该属性的访问修饰符的 int 表示

  8. Modifier.toString(1):根据访问修饰符的 int 值获取相对应的字符串表示

六. Method

在反射中 Method 一个实例代表一个类中的方法

创建方式
  1. Class对象.getDecaredMethods():获取本类中所有的方法

  2. Class对象.getDeclaredMethod(String name,Class<?> paramType):根据方法名称与参数列表获取本类中指定的方法

  3. Class对象.getMethods():获取本类、父类、父接口中的所有方法

  4. Class对象.getMethod(String name,Class<?> paramType):根据方法名称与参数列表获取本类

常用方法
  1. getName():获取方法名

  2. getParameterTypes():获取参数列表

  3. getModifiers():访问修饰符

  4. getReturnType():获取返回值类型

  5. getExceptionTypes():获取异常类型

  6. invoke(Object obj, Object paramValue):执行方法(方法的回调)

七. 注解

注解的定义
  1. @Documented:表示注解文档

  2. public @interface Table{}:表示注解类  定义注解,并不是 interface

  3. @Target(value={ElementType.TYPE}:表示作用范围,作用范围由ElementType指定,常用如下:

    • TYPE 表示作用在类上

    • FIELD 表示作用在字段上

    • METHOD 表示作用在方法上

    • PARAMETER 表示作用在参数列表上

    • CONSTRUCTOR 表示作用在构造方法上

  4. @Retention(RetentionPolicy.RUNTIME):指定注解的生命周期,一共三种,通过 RetentionPolicy 定义,具体如下:

    • SOURCE 表示在源码中有效

    • CLASS 表示在字节码文件中有效(.class文件)

    • RUNTIME 表示在 JVM 运行时有效

注:如果注解里面只有一个 value 属性,可以省略不写,默认就是 value=

注解的获取
  1. Class对象.getAnnotation(Class annotationClass):获取类上的注解

  2. Field对象.getAnnotation(Class annotationClass):获取字段上的注解

  3. Method对象.getAnnotation(Class annotationClass):获取方法上的注解