JavaSE-反射
学到Spring框架发现自己JavaSE的反射还没学,就滚过来学反射了。
黑马的这个课讲的真不错,比尚硅谷的那个要简练一些,很轻松就能听懂了。
反射
Reflection allows programmatic access to information about the fields, methods and constructors of loaded classes, and the use of reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
官方对反射的描述:反射允许以编程方式访问已加载类的字段、方法和构造函数的信息,并在安全限制范围内使用反射字段、方法和构造函数来操作其底层对应项。
总之反射就是要获取某个类的Class文件,并解剖出它的成员变量、成员方法和构造方法。
反射第一步:获取class
要获取class,总共有三种方法
Class.forName("全类名")
类名.class
对象.getClass()
说明:
- 1中的全类名指的是包名+类名,一般可以直接复制粘贴
- 3的getClass方法是Object里的方法,所以所有对象都可以调用
- 三种方法虽然都可以获取class,但是对应的阶段不同
- 1对应的是源代码阶段
- 2对应的是加载到内存的阶段,一般作参数传递
- 3对应的是运行时阶段,只有这个类的对象创建时才能使用
反射第二步:获得并使用构造方法、属性、成员方法
Java中有一个重要的思想就是万事万物皆对象,相应的,构造方法、属性和成员方法也有其对应的类
属性(Field类)、成员方法(Method类)、构造方法(Constructor)
1.获得并使用构造方法
- Class类中的方法:
1 | Constructor<?>[] getConstrutors(); |
- 使用Constructor类的方法,获得修饰符、名字、形参、对象创建
1 | public int getModifiers();//获得权限修饰符 |
(IDEA底层的代码提示其实就是用的反射)
关于modifiers()
变量和类型 | 常量字段 | 值 |
---|---|---|
public static final int |
ABSTRACT |
1024 |
public static final int |
FINAL |
16 |
public static final int |
INTERFACE |
512 |
public static final int |
NATIVE |
256 |
public static final int |
PRIVATE |
2 |
public static final int |
PROTECTED |
4 |
public static final int |
PUBLIC |
1 |
public static final int |
STATIC |
8 |
public static final int |
STRICT |
2048 |
public static final int |
SYNCHRONIZED |
32 |
public static final int |
TRANSIENT |
128 |
public static final int |
VOLATILE |
64 |
使用暴力反射进行对象的创建:
对于私有构造器的使用,注意使用setAccessible(true)
跳过权限验证
1 | Class clazz = Class.forName("User"); |
输出结果:
1 | 2//输出的权限修饰符,以int表示,2表示private |
可以看到,虽然构造器是私有的,但是我们通过暴力反射的方式也一样创建了对象
2.获取成员变量
- Class类的方法
1 | Field<?>[] getFields(); |
- 使用Field类的方法获取修饰符、名字、获取类型、获取/设定值
1 | void set(Object obj,Object value); |
对于私有属性的使用,注意使用setAccessible(true)
跳过权限验证
3.获取成员方法
- Class类的方法
1 | Method<?>[] getMethods();//包含父类的所有public方法 |
- 使用Method类的方法获得修饰符、名字、形参、返回值、注解、抛出异常
1 | getModifiers(); |
- 方法运行
1 | Object invoke(Object obj,Objetc...args); |
反射的应用
- 保存任意对象数据
- 动态创建对象
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 KuoZ's blog!