说起java的序列化,我们最初的理解就是形成一个文件,保存到本地,这是最为常用的一点,也算是较为基础的一部分了。
而反射呢,不外乎就是跳过预编译,生成一个对象,代替一个new 的过程。
常用基础的应该就是Class.forName(),和Class.newInstance()这两个方法了。
在这周的空闲时间重新回顾了下java反射的基础,对其有了一个新的理解,其主要的工具包主要是依赖于 java.lang.reflect包中。
用一个情景来进行解释好了,我们设拥有这样的一个场景,
现在我们由一个Data的类(它拥有的属性是任意类型的),然后我们得到了一串关于Data类属性的值,我们通过反射来创建一个拥有实际值的Data对象。
先来总结一下,本次情景主要用到的方法,并且做一个总结:
获取构造方法:
getConstructors():所有"公有的"构造方法
getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
其中要注意的是使用getDeclaredConstructors()获得私有时,需要用到setAccessible()来进行解除限定。
获取类中每一条属性的记录:
-
getFields():获取所有的"公有字段"
-
getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有
其中要注意的一项是反射生成的是一个对象的数据,而不是一个类。因此对于获取到的静态变量,其实属于整个类的,不加入反射。
获取方法,调用方法:
1.批量的:
public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
2.获取单个的:
public Method getMethod(String name,Class<?>... parameterTypes):
*参数:
* name : 方法名;
* Class ... : 形参的Class类型对象
* public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
* 调用方法:
* Method --> public Object invoke(Object obj,Object... args):
* 参数说明:
* obj : 要调用方法的对象;
* args:调用方式时所传递的实参;
为了区分概念免得混淆代码先来一个简陋的识别:
Field:代表整一条的属性。
Class:修饰词(例如String类,Interge类这些)
Object:值(储存的是值,例如String name = “11211”,其中Object指的是11211)
下面是代码实现部分:
主测试类:
public class ReflectData {
private static