Java反射之getDeclaredField()

package learnIng;

import java.util.Date;

public class Program {
    public Program() {
    }

    public Program(String str, Date date, int i) {
        this.str = str;
        this.date = date;
        this.i = i;
    }

    public String str = "Hello";
    private Date date = new Date();
    protected int i = 0;

    public int getI() {
        return i;
    }

    public String getStr() {
        return str;
    }
}

getDeclaredField()测试如下:

package learnIng;

import java.lang.reflect.Field;

public class GetDeclaredFieldTest {
     public static void main(String[] args) throws IllegalArgumentException,
     IllegalAccessException {
 try {
     Program program = new Program();
     Class progClass = program.getClass();
     //通过反射机制,获取到类Program中的str
     Field strField1 = progClass.getDeclaredField("str");
     //输出private java.lang.String Program.str            
     System.out.println("Field found: " + strField1.toString());

     //同上
     Field dateField = progClass.getDeclaredField("date");
     System.out.println("Field found: " + dateField.toString());
     //同上
     Field iField = progClass.getDeclaredField("i");
     System.out.println("Field found: " + iField.toString());

     //我想说的是这一点,这里能获取到类Program中的str并对其修改。
     //Program类中没有对str设置的setStr()方法,而且使用了private,
     //这是不允许访问的。
     //但是我们能通过反射机制,从而获取private类型的值,并直接改。
     Field strField = progClass.getDeclaredField("str");
     strField.set(program, "我是Str字符串。");
     //输出:我是Str字符串。
     System.out.println(program.getStr());

 } catch (NoSuchFieldException ex) {
     System.out.println(ex.toString());
 }
}
}

实验结果如下:

Field found: public java.lang.String learnIng.Program.str
Field found: private java.util.Date learnIng.Program.date
Field found: protected int learnIng.Program.i
我是Str字符串。

根据实验结果可以看出getDeclaredField()方法可以获取类中的属性并且可以更改类中属性的值。

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页