前年写过一篇关于java“反射”的博客,现在看来不够深入。如今在原来的基础上再加一些东西。主要细化一下反射中主要用到的方法。还是在原来代码的基础上进行测试。
1. 获取反射class对象
在原来的博客中介绍过反射获取class对象的三种方式。如下:
打印结果为:
class对象内容:
区别:
三种方式常用第三种,
第一种:对象都有了还要反射干什么。可以通过一些放射方法来操作这个对象。
第二种:需要导入类的包,依赖太强,不导包就抛编译错误。
第三种:一个字符串可以传入也可写在配置文件中等多种方法。
2. 属性Field
2.1 获取属性
方法 | 功能 |
getFields() | 获取所有public字段,包括父类字段 |
getDeclaredFields() | 获取所有字段,public和protected和private,但是不包括父类字段 |
public Field getField(String name) | 根据字段名称获取public字段 |
public Field getDeclaredField(String name) | 根据字段名称获取自身的单个字段 |
代码dome
结果打印
:可见getFields可以获取到父类中的public字段,getDeclaredFields可以获取自身的所有字段。
2.2 属性(Field)相关方法
方法名 | 作用 |
public int getModifiers() | 得到属性的修饰符(0:没有修饰符(default);1:public;2:private;4:protected) |
public String getName() | 得到属性的名称。 |
public boolean isAccessible() | 判断此属性是否被外部访问 |
public void setAccessible(Boolean flag) | 设置一个属性是否可被外部访问。 |
public String toString() | 返回此Field类的信息 |
public Object get(Object obj) | 得到一个对象中属性的具体内容,必须要声明一个对象 |
public void set(Object obj,Object value)t | 设置指定对象中属性的具体内容,必须要声明一个对象 |
代码demo
结果打印
name, age, sex字段为父类非public字段,所以没有被访问的,也就没被赋值。
3. 方法
3.1 获取方法
方法名 | 作用 |
Method[] getMethods() | 获取所有public方法,包括父类public方法 |
Method[] getDeclaredMethods() | 获取自身声明的方法,包括私有方法但不包括父类字段 |
Constructor<?>[] getConstructors() | 获取构造函数 |
Method getMethod(String name, Class<?>... parameterTypes) | 根据方法名称获取所有public方法,包括父类public方法 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 根据方法名称获取自身声明的方法,包括私有方法但不包括父类字段 |
代码dome
结果打印
3.2 调用方法
通过调用public Object invoke(Object obj, Object... args)来实现反射调用方法,但对于私有方法需要将私有方法访问性进行修改;
代码demo
结果打印
4. 其他操作
方法名 | 作用 |
Class<? super T> getSuperclass() | 获取父类 |
5. 反射的原理