反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做 Java 语言的反射机制。
反射
指程序可以访问、检测和修改它本身状态或行为的一种能力
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)
:设置私有变量的访问权限,默认为 falseset(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)
:获取方法上的注解
Original: https://www.cnblogs.com/xiqingbo/p/java-21.html
Author: Schieber
Title: Java 反射学习笔记
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598696/
转载文章受原作者版权保护。转载请注明原作者出处!