网站首页 > 基础教程 正文
一、简介
这里介绍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.setAccessible(false);
//设置为不可访问
isAccessible = nameField.isAccessible(); //false
}
}
三、Field方法
Field中源码解释如下:
package java.lang.reflect;
//Field提供类或接口中单独字段的信息,以及对单独字段的动态访问。
//在get或set操作时,Filed允许扩大转换,缩小转换会抛异常IllegalArgumentException
public final class Field extends AccessibleObject implements Member {
//返回字段的声明类
public Class<?> getDeclaringClass() {}
//返回字段名称
public String getName() {}
//返回字段修饰符的int表示(如public, 详情见Modifiers类)
public int getModifiers() {}
//字段是否是枚举类型的一个元素
public boolean isEnumConstant() {}
//字段是否是合成字段
public boolean isSynthetic() {}
//返回字段的类实例
public Class<?> getType() {}
//返回字段的泛型类型
public Type getGenericType() {}
//当两个字段由相同的类声明,且有相同的名称和Type,则相等
public boolean equals(Object obj) {}
//返回hashcode,其由声明类名和字段名通过异或计算而得
public int hashCode() {}
//返回字段描述
public String toString() {}
//返回字段描述(包含它的泛型类型)
public String toGenericString() {}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException {}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public boolean getBoolean(Object obj) throws IllegalArgumentException, IllegalAccessException {}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public byte getByte(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public char getChar(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public short getShort(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public int getInt(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public long getLong(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public float getFloat(Object obj)throws IllegalArgumentException, IllegalAccessException{}
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
public double getDouble(Object obj) throws IllegalArgumentException, IllegalAccessException {}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void set(Object obj, Object value)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setBoolean(Object obj, boolean z)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setByte(Object obj, byte b)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setChar(Object obj, char c)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setShort(Object obj, short s)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setInt(Object obj, int i)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setLong(Object obj, long l)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setFloat(Object obj, float f)throws IllegalArgumentException, IllegalAccessException{}
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
public void setDouble(Object obj, double d)throws IllegalArgumentException, IllegalAccessException{}
//返回标识在字段上的注解
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {}
//返回标识在字段上的指定类型注解数组
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {}
//返回标识在字段上的指定类型注解数组(不包含继承)
public Annotation[] getDeclaredAnnotations() {}
//返回字段声明的AnnotatedType
public AnnotatedType getAnnotatedType() {}
}
使用示例如下:
import java.lang.annotation.*;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.List;
public class FieldStudy {
@AnnoCache(time = 61)
public String stuName = "apple";
public static Integer stuAge = 18;
public List<Person> personList;
public static void main(String[] args) throws Exception {
Class<FieldStudy> clazz = FieldStudy.class;
FieldStudy obj = new FieldStudy();
Field stuNameField = clazz.getDeclaredField("stuName");
Field stuAgeField = clazz.getDeclaredField("stuAge");
Field schoolTypeField = SchoolType.class.getDeclaredFields()[0];
Field personListField = clazz.getDeclaredField("personList");
//返回字段的声明类
Class<?> declaringClass = stuNameField.getDeclaringClass(); //FieldStudy
//返回字段名称
String name = stuNameField.getName(); //stuName
//返回字段修饰符的int表示(如public, 详情见Modifiers类)
int modifiers = stuNameField.getModifiers();
//字段是否是枚举类型的一个元素
boolean isEnumConstant = schoolTypeField.isEnumConstant(); //true
//字段是否是合成字段
boolean isSynthetic = schoolTypeField.isSynthetic(); //false
//返回字段的类实例
Class<?> type = stuNameField.getType(); //class java.lang.String
//返回字段的泛型类型,结果为List<Person>
Type genericType = personListField.getGenericType();
//当两个字段由相同的类声明,且有相同的名称和Type,则相等
boolean equals= stuNameField.equals(stuNameField);
//返回hashcode,其由声明类名和字段名通过异或计算而得
int hashCode = stuNameField.hashCode(); //1927171879
//返回字段描述
String toString = stuNameField.toString();
//返回字段描述(包含它的泛型类型)
String toGenericString = personListField.toGenericString();
//返回字段在指定对象中的值,如果字段是静态字段,则可以传null
Object getOper = stuNameField.get(obj); //apple
Object age = stuAgeField.get(null); //
//下面方法使用同前类似,就不一一举例了
// getBoolean(Object obj);
// getByte(Object obj);
// getChar(Object obj);
// getShort(Object obj);
// getInt(Object obj);
// getLong(Object obj);
// getFloat(Object obj);
// getDouble(Object obj);
//设置字段在指定对象中的值,如果字段是静态字段,则对象可以传null
stuNameField.set(obj, "banana");
stuAgeField.set(null, 16);
//下面方法使用同前类似,就不一一举例了
// setBoolean(Object obj, boolean z);
// setByte(Object obj, byte b);
// setChar(Object obj, char c);
// setShort(Object obj, short s);
// setInt(Object obj, int i);
// setLong(Object obj, long l);
// setFloat(Object obj, float f);
// setDouble(Object obj, double d);
//返回标识在字段上的指定类型注解
Annotation annotation = stuNameField.getAnnotation(AnnoCache.class);
//返回标识在字段上的指定类型注解数组
Annotation[] annotationsByType = stuNameField.getAnnotationsByType(AnnoCache.class);
//返回标识在字段上的指定类型注解数组(不包含继承)
Annotation[] declaredAnnotations = stuNameField.getDeclaredAnnotations();
//返回字段声明的AnnotatedType
AnnotatedType annotatedType = stuNameField.getAnnotatedType();
}
enum SchoolType{
PRIMITIVE,MIDDLE;
}
class Person{}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoCache{
int time() default 60;
}
}
- 上一篇: HTML DOM Form 对象
- 下一篇: css面试题总汇
猜你喜欢
- 2024-11-20 java Swing用户界面组件文本输入:文本域+密码域+格式化的输入域
- 2024-11-20 如果没有JS框架该怎么办
- 2024-11-20 12、HTML5新特性
- 2024-11-20 CSS 样式重置的两种方法
- 2024-11-20 React ant组件表单数据使用setState更新,前端不渲染问题
- 2024-11-20 行内元素和块级元素-html教程
- 2024-11-20 ASP.NET MVC – 样式和布局简介
- 2024-11-20 Java动态字节技术之Javassist
- 2024-11-20 Web前端程序员应该遵循的15个开发原则
- 2024-11-20 和无用代码说再见!阿里文娱无损代码覆盖率统计方案
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)