Field类及相关类解读
文章目录
一、简介
这里介绍java反射中常用的Fied字段。
二、Field类结构
2.1 Field解释
Field完整类名为java.lang.reflect.Field,它提供类或接口中单独字段的信息,以及对单独字段的动态访问。在get或set操作时,Filed允许扩大转换,缩小转换会抛异常IllegalArgumentException。
2.2 Field定义
public final class Field extends AccessibleObject implements Member {
}
涉及到接口Member和父类AccessibleObject。
2.2.1 Member
Member完整接口为java.lang.reflect.Member,是Field、Method、Constructor的父接口。定义如下:
public interface Member {
public static final int PUBLIC = 0;
public static final int DECLARED = 1;
//其他方法略过,后续会介绍
}
2.2.2 AccessibleObject
AccessibleObject完整类为java.lang.reflect.AccessibleObject,定义如下:
package java.lang.reflect;
import java.security.AccessController;
import sun.reflect.Reflection;
import sun.reflect.ReflectionFactory;
import java.lang.annotation.Annotation;
//AccessibleObject是Field、Method和Constructor的基类,通过标识位控制访问权限
public class AccessibleObject implements AnnotatedElement {
//静态方法,设置指定AccessibleObject数组对象是否可访问
public static void setAccessible(AccessibleObject[] array, boolean flag)throws SecurityException {
}
//设置是否可通过反射访问,true:可以 false:不可以
public void setAccessible(boolean flag) throws SecurityException {
}
}
使用示例如下:
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
public class AccessibleObjectStudy {
public String stuName = "apple";
public static void main(String[] args) throws Exception {
AccessibleObjectStudy obj = new AccessibleObjectStudy();
Field nameField = obj.getClass().getDeclaredField("stuName");
//初始状态为false,不可访问
boolean isAccessible = nameField.isAccessible(); //false
//通过静态方法,设置指定AccessibleObject数组对象是否可访问
AccessibleObject.setAccessible(new Field[]{
nameField}, true);
isAccessible = nameField.isAccessible(); //true
nameField.setAcce