ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaSE-24.2.3【反射获取成员变量并使用】

2021-06-20 20:01:27  阅读:135  来源: 互联网

标签:反射 name age 24.2 Field Student address JavaSE String


 1 package day15.lesson2;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 
 7 /*
 8 2.6 反射获取成员变量并使用
 9 
10     Class类获取成员变量对象的方法
11         Field[] getFields() 返回所有公共成员变量对象的数组
12         Field[] getDeclaredFields() 返回所有成员变量对象的数组
13         Field getField(String name) 返回单个公共成员变量对象
14         Field getDeclaredField(String name) 返回单个成员变量对象
15 
16     Field类用于给成员变量赋值的方法
17         void set(Object obj,Object value) 给obj对象的成员变量赋值为value
18 
19  */
20 public class Demo4Reflect {
21     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
22         Class<?> c = Class.forName("day15.lesson2.Student");
23 
24         Field[] fields = c.getFields();
25         for (Field f: fields){
26             System.out.println(f);
27         }
28         //public java.lang.String day15.lesson2.Student.address
29         System.out.println();
30 
31         Field[] declaredFields = c.getDeclaredFields();
32         for (Field f: declaredFields){
33             System.out.println(f);
34         }
35         /*
36         private java.lang.String day15.lesson2.Student.name
37         int day15.lesson2.Student.age
38         public java.lang.String day15.lesson2.Student.address
39          */
40         System.out.println();
41 
42         Field addressField = c.getField("address"); //公共的成员变量
43         /*Student s = new Student();
44         s.address = "南京";
45         System.out.println(s);*/
46         //通过反射实现上述功能
47         Constructor<?> con = c.getConstructor(); //获取公共无参构造
48         Object obj = con.newInstance(); //创建对象
49         addressField.set(obj, "南京"); //给对象obj的成员变量addressField赋值"南京"
50         System.out.println(obj); //Student{name='null', age=0, address='南京'}
51         System.out.println();
52 
53 //        Field declaredField = c.getDeclaredField("name"); //私有成员变量
54     }
55 }
 1 class Student{
 2     //成员变量
 3     private String name; //私有
 4     int age; //默认
 5     public String address; //公共
 6 
 7     //构造方法
 8     public Student() { //公共
 9     }
10 
11     public Student(String name, int age, String address) { //公共
12         this.name = name;
13         this.age = age;
14         this.address = address;
15     }
16 
17     private Student(String name){ //私有
18         this.name = name;
19     }
20 
21     Student(String name, int age){ //默认
22         this.name = name;
23         this.age = age;
24     }
25 
26     //成员方法
27     private void function(){ //私有
28         System.out.println("function");
29     }
30 
31     public void method1(){ //公共
32         System.out.println("method");
33     }
34 
35     public void method2(String s){ //公共
36         System.out.println("method:" + s);
37     }
38 
39     public String method3(String s, int i){ //公共
40         return s + "," + i;
41     }
42 
43     @Override
44     public String toString() { //公共
45         return "Student{" +
46                 "name='" + name + '\'' +
47                 ", age=" + age +
48                 ", address='" + address + '\'' +
49                 '}';
50     }
51 }
 1 package day15.lesson2;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 
 7 /*
 8 2.7 反射获取成员变量并使用练习
 9 
10     通过反射获取成员变量并赋值
11 
12     通过反射实现一下操作:
13         Student s = new Studet();
14         s.name = "tom";
15         s.age = 23;
16         s.address = "南京";
17         sout(s);
18  */
19 public class Demo5Reflect {
20     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
21         Class<?> c = Class.forName("day15.lesson2.Student");
22 
23 //        Student s = new Student();
24         Constructor<?> con = c.getConstructor();
25         Object obj = con.newInstance();
26         System.out.println(obj); //Student{name='null', age=0, address='null'}
27 
28 //        s.name = "tom";
29         Field nameField = c.getDeclaredField("name"); //私有只能用xxxDeclaredxxx
30         nameField.setAccessible(true); //私有得暴力反射
31         nameField.set(obj, "tom");
32         System.out.println(obj); //Student{name='tom', age=0, address='null'}
33 
34 //        s.age = 23;
35         Field ageField = c.getDeclaredField("age"); //默认的也只能用xxxDeclaredxxx
36         ageField.set(obj, 23);
37         System.out.println(obj); //Student{name='tom', age=23, address='null'}
38 
39 //        s.address = "南京";
40 //        Field addressField = c.getField("address"); //公共的既能用getField也能用getDeclaredField
41         Field addressField = c.getDeclaredField("address"); //为了方便统一用getDeclaredField即可
42         addressField.set(obj, "南京");
43         System.out.println(obj); //Student{name='tom', age=23, address='南京'}
44     }
45 }

 

标签:反射,name,age,24.2,Field,Student,address,JavaSE,String
来源: https://www.cnblogs.com/yppah/p/14907895.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有