反射机制中的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));

运行结果:

 

posted @ 2020-12-04 17:46  L1998  阅读(217)  评论(0)    收藏  举报