专业编程基础技术教程

网站首页 > 基础教程 正文

Field类及相关类解读

ccvgpt 2024-11-20 12:59:57 基础教程 6 ℃

一、简介

这里介绍java反射中常用的Fied字段。

Field类及相关类解读

二、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;

}

}

Tags:

最近发表
标签列表