反射
指程序可以访问、检测和修改它本身状态或行为的一种能力
Java 通过字节码反射出类中的信息,包含:类、属性、方法、构造、继承、实现
在 JDK 中java.lang
包与java.lang.reflect
包下
一. Class 类
在反射中 Class 代表一个类,也叫类类型,是 Java 数据类型中的一种
创建方式
-
Class.forName("完整路径")
-
类名.class
-
对象名.getClass()
常用方法
-
getName()
:获取类的完整路径 -
getSimpleName()
:获取类的名称 -
newInstance()
:创建类的新实例,就是新对象
二. Java 中的数据类型()
-
基本数据类型(8种)
-
引用类型(数组和对象)
-
枚举
-
类类型
三. Java 中创建对象方式()
-
new关键字
-
反序列化
-
反射
-
克隆
四. Constructor
在 Java 反射中 Constructor 的一个实例代表一个类的构造方法,可以通过类类型获取
创建方式
-
class对象.getConstructors()
:获取所有的构造方法,返回一个构造方法数组 -
class对象.getConstructor()
:获取指定构造方法
常用方法
-
getName()
:获取构造方法的名称 -
getParameterTypes()
:获取构造方法参数列表 -
getModefiers()
:获取构造方法访问修饰符 -
getExceptionTypes()
:获取构造方法的异常 -
newInstance()
:根据指定的构造方法创建对象
五. Filed
在 Java 反射中 Filed 一个实例代表一个类中的属性
创建方式
-
getDeclaredFields()
:获取本类中的所有属性,返回一个属性数组 -
getDeclaredField(String name)
:根据名称获取本类中的单个属性 -
getFields()
:获取父类、父接口中所有的 public 修饰的属性 -
getField(String name)
:根据名称获取父类,父接口中的 public 修饰的属性
常用方法
-
getName()
:获取属性名称 -
getModifiers()
:获取属性访问修饰符 -
getType()
:获取属性数据类型 -
setAccessible(boolean b)
:设置私有变量的访问权限,默认为 false -
set(Object obj, Object value)
:给属性赋值 -
get(Objuct obj)
:获取属性值 -
getModifiers()
:获取该属性的访问修饰符的 int 表示 -
Modifier.toString(1)
:根据访问修饰符的 int 值获取相对应的字符串表示
六. Method
在反射中 Method 一个实例代表一个类中的方法
创建方式
-
Class对象.getDecaredMethods()
:获取本类中所有的方法 -
Class对象.getDeclaredMethod(String name,Class<?> paramType)
:根据方法名称与参数列表获取本类中指定的方法 -
Class对象.getMethods()
:获取本类、父类、父接口中的所有方法 -
Class对象.getMethod(String name,Class<?> paramType)
:根据方法名称与参数列表获取本类
常用方法
-
getName()
:获取方法名 -
getParameterTypes()
:获取参数列表 -
getModifiers()
:访问修饰符 -
getReturnType()
:获取返回值类型 -
getExceptionTypes()
:获取异常类型 -
invoke(Object obj, Object paramValue)
:执行方法(方法的回调)
七. 注解
注解的定义
-
@Documented
:表示注解文档 -
public @interface Table{}
:表示注解类 定义注解,并不是 interface -
@Target(value={ElementType.TYPE}
:表示作用范围,作用范围由ElementType指定,常用如下:-
TYPE 表示作用在类上
-
FIELD 表示作用在字段上
-
METHOD 表示作用在方法上
-
PARAMETER 表示作用在参数列表上
-
CONSTRUCTOR 表示作用在构造方法上
-
-
@Retention(RetentionPolicy.RUNTIME)
:指定注解的生命周期,一共三种,通过 RetentionPolicy 定义,具体如下:-
SOURCE 表示在源码中有效
-
CLASS 表示在字节码文件中有效(.class文件)
-
RUNTIME 表示在 JVM 运行时有效
-
注:如果注解里面只有一个 value 属性,可以省略不写,默认就是
value=
注解的获取
-
Class对象.getAnnotation(Class annotationClass)
:获取类上的注解 -
Field对象.getAnnotation(Class annotationClass)
:获取字段上的注解 -
Method对象.getAnnotation(Class annotationClass)
:获取方法上的注解