实体类
1 import java.lang.reflect.Field; 2 import java.util.Date; 3 4 public class Program { 5 public Program() { 6 } 7 8 public Program(String str, Date date, int i) { 9 this.str = str; 10 this.date = date; 11 this.i = i; 12 } 13 14 private String str = "Hello"; 15 private Date date = new Date(); 16 protected int i = 0; 17 18 public int getI() { 19 return i; 20 } 21 22 public String getStr() { 23 return str; 24 }
测试方法
1 public static void main(String[] args) throws IllegalArgumentException, 2 IllegalAccessException { 3 try { 4 Program program = new Program(); 5 Class progClass = program.getClass(); 6 //通过反射机制,获取到类Program中的str 7 Field strField1 = progClass.getDeclaredField("str"); 8 //输出private java.lang.String Program.str 9 System.out.println("Field found: " + strField1.toString()); 10 11 //同上 12 Field dateField = progClass.getDeclaredField("date"); 13 System.out.println("Field found: " + dateField.toString()); 14 //同上 15 Field iField = progClass.getDeclaredField("i"); 16 System.out.println("Field found: " + iField.toString()); 17 18 //我想说的是这一点,这里能获取到类Program中的str并对其修改。 19 //Program类中没有对str设置的setStr()方法,而且使用了private, 20 //这是不允许访问的。 21 //但是我们能通过反射机制,从而获取private类型的值,并直接改。 22 Field strField = progClass.getDeclaredField("str"); 23 strField.set(program, "我是Str字符串。"); 24 //输出:我是Str字符串。 25 System.out.println(program.getStr()); 26 27 } catch (NoSuchFieldException ex) { 28 System.out.println(ex.toString()); 29 } 30 } 31 }
输出是:
Field found: private java.lang.String Program.str
Field found: private java.util.Date Program.date
Field found: protected int Program.i
我是Str字符串。
版权归本人所有,转载请注明出处。