Java反射 - 字段

简介: 使用Java反射,您可以检查类的字段(成员变量)并在运行时获取/设置它们。 这是通过Java类java.lang.reflect.Field完成的。 本文将更详细地介绍Java Field对象。

使用Java反射,您可以检查类的字段(成员变量)并在运行时获取/设置它们。 这是通过Java类java.lang.reflect.Field完成的。 本文将更详细地介绍Java Field对象。 请记住也要检查Sun的JavaDoc。

获取字段对象

Field类是从Class对象中获取的。 这里是一个例子:

Class aClass = ...//获取一个class对象
Field[] fields = aClass.getFields();

Field []数组将为每个在类中声明的公共字段设置一个Field实例。

如果您知道要访问的字段的名称,则可以像这样访问它:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

上面的例子将返回Field实例对应的字段someField,如下面的MyObject所声明的:

public class MyObject{
  public String someField = null;

}

如果没有字段以getField()方法的参数形式存在,则抛出NoSuchFieldException。

字段名称

获得Field实例后,可以使用Field.getName()方法获取其字段名称,如下所示:

Field field = ... //obtain field object
String fieldName = field.getName();

字段类型

您可以使用Field.getType()方法确定字段的字段类型(String,int等):

Field field = aClass.getField("someField");
Object fieldType = field.getType();

获取和设置字段值

获得Field引用后,可以使用Field.get()和Field.set()方法来获取和设置其值,如下所示:

Class  aClass = MyObject.class
Field field = aClass.getField("someField");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);

传递给get和set方法的objectInstance参数应该是拥有该字段的类的一个实例。 在上面的例子中,使用了MyObject的实例,因为someField是MyObject类的实例成员。

它是一个静态字段(public static ...),它传递null作为get和set方法的参数,而不是上面传递的objectInstance参数。

实战

package com.reflection.detail;

import java.lang.reflect.Field;

/**
 * Created by Fant.J.
 * 2018/2/7 14:51
 */
public class Reflection_Fields {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        //获取field对象
        Class aClass = People.class;
        Field[] fields = aClass.getFields();

        //如果你知道一些字段的名字,你可以这样获取到它
        Field field = aClass.getField("someField");
        System.out.println(field.getName()+"   "+field.getType());

        //那么,我们能获取到它的字段类型,那如何取出该字段的值呢
        People people = new People();
        Object obj = field.get(people);
        System.out.println(obj.toString());

        //如何给字段设置值呢
        field.set(people,"shuai");
        Object obj2 = field.get(people);
        System.out.println(obj2.toString());
    }
}

结果

someField   class java.lang.String
FantJ
shuai

项目代码:github链接

相关文章
|
1月前
|
网络协议 算法 Java
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
60 0
|
1月前
|
Java 程序员 编译器
认识Java 的反射机制
反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。
29 5
|
1月前
|
Java 关系型数据库 MySQL
在Java的反射中,Class.forName和ClassLoader的区别
在Java的反射中,Class.forName和ClassLoader的区别
35 3
|
5天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
11天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
25 0
|
15天前
|
安全 Java
java反射篇
java反射篇
|
16天前
|
存储 Java
java反射——设计框架的灵魂
java反射——设计框架的灵魂
|
22天前
|
Java
Java通过反射获取类调用方法
Java通过反射获取类调用方法
18 0
|
30天前
|
设计模式 XML 存储
java中的反射机制
java中的反射机制
12 1