我是靠谱客的博主 酷酷钢笔,最近开发中收集的这篇文章主要介绍【Reflect】变量(Field),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用Java反射机制你可以运行期检查一个类的变量信息(成员变量)或者获取或者设置变量的值。

通过使用java.lang.reflect.Field类就可以实现上述功能。

以下涉及实例通用代码MyObject.java:

package com.lanhuigu.reflect.common;

public class MyObject {
    /** 公开成员变量 */
    public String fieldName = "Test-Field-Name";
    /** 私有属性 */
    private String userName;
    private String password;

    /** 构造器 */
    public MyObject() {

    }

    public MyObject(String userName) {
        this.userName = userName;
    }

    public MyObject(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    /** getter and setter methods */
    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


获取Field对象

 

可以通过Class对象获取Field对象,如下例:

Class myClass = ...//获取Class对象

 

 

Field[] methods = myClass.getFields();

 

返回的Field对象数组包含了指定类中声明为公有的(public)的所有变量集合。

eg:

package com.lanhuigu.reflect.fields;

import java.lang.reflect.Field;

public class Test2 {
    public static void main(String[] args) {
        try {
            /** 获取Class对象 */
            Class myClass = Class.forName("com.lanhuigu.reflect.common.MyObject");
            /** 获取对象所有公开(public)属性 */
            Field[] fields = myClass.getFields();
            /** 循环输出变量名称 */
            for (Field field : fields) {
                System.out.println(field.getName());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}


如果你知道你要访问的变量名称,你可以通过如下的方式获取指定的变量:
Class myClass = MyObject.class
Field field = myClass.getField("fieldName");
上面的例子返回的Field类的实例对应的就是在MyObject类中声明的名为fieldName的成员变量,如下:
public class MyObject{
  /** 公开成员变量 */
  public String fieldName = "Test-Field-Name";
}
在调用getField()方法时,如果根据给定的方法参数没有找到对应的变量,那么就会抛出NoSuchFieldException。
eg:

 

package com.lanhuigu.reflect.fields;

import java.lang.reflect.Field;

public class Test3 {
    public static void main(String[] args) {
        try {
            /** 获取Class对象 */
            Class myClass = Class.forName("com.lanhuigu.reflect.common.MyObject");
            /** 根据属性名获取Field */
            Field field = myClass.getField("fieldName");
            /** 输出变量名称 */
            System.out.println(field.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}


变量名称

 

一旦你获取了Field实例,你可以通过调用Field.getName()方法获取他的变量名称,如下例:

Field field = ... //获取Field对象

 

 

String fieldName = field.getName();


变量类型

 

 

你可以通过调用Field.getType()方法来获取一个变量的类型(如String, int等等),如下例:

Field field = myClass.getField("fieldName");

 

 

Object fieldType = field.getType();

 

eg:

 

package com.lanhuigu.reflect.fields;

import java.lang.reflect.Field;

public class Test4 {
    public static void main(String[] args) {
        try {
            /** 获取Class对象 */
            Class myClass = Class.forName("com.lanhuigu.reflect.common.MyObject");
            /** 根据属性名获取Field */
            Field field = myClass.getField("fieldName");
            /** 输出变量类型 */
            Object fieldType = field.getType();
            System.out.println("变量类型:" + fieldType);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

 


获取或设置(get/set)变量值

 

一旦你获得了一个Field的引用,你就可以通过调用Field.get()或Field.set()方法,获取或者设置变量的值,如下例:

 

Class myClass = MyObject.class;

Field field = myClass.getField("fieldName");

MyObject objectInstance = new MyObject();

Object value = field.get(objectInstance);

field.set(objetInstance, value);

传入Field.get()/Field.set()方法的参数objetInstance应该是拥有指定变量的类的实例。

在上述的例子中传入的参数是MyObject类的实例,是因为fieldName是MyObject类的实例。

如果变量是静态变量的话(public static)那么在调用Field.get()/Field.set()方法的时候

传入null做为参数而不用传递拥有该变量的类的实例。

eg:

package com.lanhuigu.reflect.fields;

import com.lanhuigu.reflect.common.MyObject;

import java.lang.reflect.Field;

public class Test5 {
    public static void main(String[] args) {
        try {
            /** 获取Class对象 */
            Class myClass = Class.forName("com.lanhuigu.reflect.common.MyObject");
            /** 根据属性名获取Field */
            Field field = myClass.getField("fieldName");
            MyObject objectInstance = new MyObject();
            /** 通过get获取值 */
            Object value = field.get(objectInstance);
            System.out.println("Field.get()获取值:" + value.toString());
            /** 通过set设置值 */
            String fieldNameValue = "0000000000000000-new-value";
            field.set(objectInstance, fieldNameValue);
            /** 从新获取set进去的新值 */
            Object value2 = field.get(objectInstance);
            System.out.println("Field.get()获取Field.set()的新值:" + value2.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

 

最后

以上就是酷酷钢笔为你收集整理的【Reflect】变量(Field)的全部内容,希望文章能够帮你解决【Reflect】变量(Field)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部