Reflect在文档中的位置:
文档链接:https://docs.oracle.com/javase/8/docs/api/index.html
用于获取类或对象的反射信息。
常用的反射机制重要的类:
java.lang.Class:整个字节码,代表一个类型。包含了以下三块内容;
java.lang.reflect.Nethod:method的字节码;
java.lang.reflect.Constructor:构造方法的字节码;
java.lang.reflect.Field:属性相关的字节码。注意与local_variable
的区分。
- 作用:
可以通过反射机制,实现OCP开闭原则,即对扩展开发,对修改关闭。框架中常用,让程序更加灵活 - 获取Class的三种方法
静态方法:
forName()的执行,会加载该类。即该类的静态代码块会执行一次。
比如,获取String的字节码(异常处理,ClassNotFoundException):
Class strCls = Class.forName("java.lang.String");
另外两种获取Class的方法:
// 通过实例方法getClass()获取(getClass是Object的方法)
Class strCls = "abc".getClass();
// 通过静态熟悉获取
Class strCls = String.class;
Class intCls = int.class;
Class dateCls = Date.class;
Class doubleCls = double.class;
// ...
Class常用方法:
methods | describe |
---|---|
newInstance | 创建一个该类型的实例对象(Creates a new instance of the class represented by this Class object.) |
getFields | 获取该类中所有public的属性 |
getDeclaredFields | 获取该类中所有的属性 |
getDeclaredMethods | 获取类的方法:实例方法、静态方法等 |
getDeclaredMethod | 获取类的指定方法 |
getDeclaredConstructors | 获取构造方法 |
getDeclaredConstructor | 获取指定参数的构造方法 |
Field常用方法:
methods | describe |
---|---|
getModifiers | 获取当前属性的修饰符类型的int值 |
getType | 获取当前属性的类型 |
getName | 获取当前属性的key |
set(obj, attrStr) | 设置当前类实例属性的值。eg,obj为当前类的实例对象 |
get(obj) | 获取当前类实例属性的值 |
Modifier常用方法:
methods | describe |
---|---|
toString | 把修饰符类型的int值转换为字符串。default-0、public-1、private-2、protected-4、static-8、final-16 |
Method常用方法:
methods | describe |
---|---|
invoke(obj, args) | 执行当前的方法,返回值等同于被反射的调用方法的返回值 |
invoke在被调用时,要注意剩余参数的匹配。paramterType[] -> new Type[] {xxx, yyy}
Constructor常用方法:
methods | describe |
---|---|
newInstance(Object… params) | 执行指定的构造方法,创建对象 |
- 注解Annotation
一种引用类型,和普通的类相似,也是生成xxx.class文件,并且可以互相引用。比如注解也可以作用于注解上。一般用于校验等,具体用法待后续补充
元注解:Target、Retention
Target:注解作用于那些类型上
Retention:注解作用在那个阶段上。源码、Class、Class + 反射机制发现
JDK内置注解:
Deprecated:表示当时被注解的目标已过时
Override: 只能用在方法上,编译阶段,和运行阶段无关. 重写父类的方法。标识性注解