反射机制中的Field
1.通过反射机制,反编译一个类的属性Field
1 package Reflect; 2 import java.lang.reflect.Field; 3 import java.lang.reflect.Modifier; 4 5 //通过反射机制,反编译一个类的属性Field 6 public class ReflectTest06 { 7 public static void main(String[] args) throws Exception{ 8 StringBuilder s=new StringBuilder();//进行字符串拼接 9 Class studentClass=Class.forName("bean.StudentInfo");//StudentInfo类在包bean下 10 s.append(Modifier.toString(studentClass.getModifiers())+"\tclass\t"+studentClass.getSimpleName()+" {\n"); 11 /* 12 * 13 * .getModifiers()方法获取类名前面的修饰符(public、private、protected等),返回的是数字,可以通过Modifier.toString()方法转换成字符串 14 * .getSimpleName()方法获取类名 15 * 16 */ 17 Field[] fields=studentClass.getDeclaredFields(); 18 19 //遍历fields 20 21 for(Field field:fields){ 22 s.append("\t"); //缩进 23 s.append(Modifier.toString(field.getModifiers()));//获取属性的修饰名(Modifier):public、private、protected... 24 s.append(" ");//空格 25 s.append(field.getType().getSimpleName());//获取属性的类型名(Type):int、string、double... 26 s.append(" ");//空格 27 s.append(field.getName());//获取属性名:自己定义的名字如:no、name、age等 28 s.append(";\n"); 29 30 } 31 32 s.append("}"); 33 System.out.println(s); 34 35 } 36 37 }
运行结果:

2.通过反射机制,获取类的属性、给属性赋值、读取给属性赋的值
1 package Reflect; 2 3 import java.lang.reflect.Field; 4 import bean.StudentInfo; 5 6 /* 7 * 如何通过反射机制访问一个java对象的属性? 8 * 给属性赋值set 9 * 获取属性的值get 10 * 11 */ 12 public class ReflectTest07 { 13 14 public static void main(String[] args)throws Exception { 15 /* 16 不使反射机制,访问对象的属性并赋值,然后读取 17 StudentInfo s=new StudentInfo(); 18 s.no=111; 19 */ 20 21 //使用反射机制,获取对象的属性并赋值 22 Class studentClass=Class.forName("bean.StudentInfo");//获取对象 23 Object obj=studentClass.newInstance();//创建对象:obj就是Student对象。(底层调用无参数构造方法) 24 25 //第一步:获取属性 26 Field noField=studentClass.getDeclaredField("no");//通过属性的名字"no"获取对应的属性 27 28 //第二步:给obj对象(Student对象)的no属性赋值 29 noField.set(obj, 11); 30 31 //第三步:读取 32 noField.get(obj); 33 34 System.out.println(noField.get(obj)); 35 } 36 37 }
运行结果:
11
注:无法访问private修饰的属性
1 Field nameField=studentClass.getDeclaredField("name"); 2 nameField.set(obj, "小明"); 3 System.out.println("获取私有属性----->name:"+nameField.get(obj));
运行结果:

这种情况下如何访问私有属性?
打破封装:使用.setAccessible()方法,即可完成对私有属性的访问及更改
这是反射机制的缺点!!!
1 Field nameField=studentClass.getDeclaredField("name"); 2 nameField.setAccessible(true);//打破封装 3 nameField.set(obj, "小明"); 4 System.out.println("获取私有属性----->name:"+nameField.get(obj));
运行结果:


浙公网安备 33010602011771号