Java反射學習-1 - 反射獲取類的屬性,方法,構造器


 

新建一個Person類

 1 package cn.tx.reflect;
 2 
 3 /**
 4  * 注解初步了解
 5  * @author Administrator
 6  *
 7  */
 8 public class Person {
 9     private Integer id;
10     private String name;
11     private String address;
12     
13     
14     public Person() {
15         super();
16     }
17     
18     public Person(Integer id, String name, String address) {
19         super();
20         this.id = id;
21         this.name = name;
22         this.address = address;
23     }
24 
25     public String getName() {
26         return name;
27     }
28     public Integer getId() {
29         return id;
30     }
31     public void setId(Integer id) {
32         this.id = id;
33     }
34     public void setName(String name) {
35         this.name = name;
36     }
37     public String getAddress() {
38         return address;
39     }
40     public void setAddress(String address) {
41         this.address = address;
42     }
43     
44     public static void printInfo(){
45         System.out.println("靜態方法反射調用");
46     }
47 
48     @Override
49     public String toString() {
50         return "Person [address=" + address + ", id=" + id + ", name=" + name
51                 + "]";
52     }
53     
54 
55 }
  1 package cn.tx.reflect;
  2 
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Method;
  6 import java.util.Arrays;
  7 /**
  8  * 一、反射獲取類的屬性,方法,構造器
  9  * @author Administrator
 10  *
 11  */
 12 public class ReflectLearn1 {
 13     
 14     private static String className = "java.lang.String";
 15     public static void main(String[] args) throws Exception {
 16         // <?>中的問號為泛型,表示不知道后面list對象 中存放的實際類型是什么,用?表示
 17         // List<?> list = new ArrayList();
 18 
 19         // 1.根據一個類的全路徑名獲取一個類的類對象:Class對象
 20         
 21         Class<?> clazz = Class.forName(className);  22 
 23         // 2.獲得傳遞過來的類(上面的String類)的所有聲明方法——目的就是為了調用獲得的方法
 24         Method[] methods = clazz.getDeclaredMethods();  25         for (Method m : methods) {
 26             System.out.println(m);
 27         }
 28 
 29         // 3.獲得類的所有聲明的屬性——目的:設置屬性或者是獲取屬性值,或者是獲取屬性上的注解!
 30         System.out.println("-------------獲得類的所有聲明的屬性---------------");
 31         Field[] fields = clazz.getDeclaredFields();  32         for (Field field : fields) {
 33             System.out.println(field);
 34         }
 35 
 36         // 4.獲得類的所有構造器——創建對象
 37         System.out.println("--------------獲得類的所有構造器--------------");
 38         Constructor<?>[] constructors = clazz.getDeclaredConstructors();  39         for (Constructor<?> constructor : constructors) {
 40             System.out.println(constructor);
 41         }
 42         
 43        //5.獲取一個類的Class對象的三種方式:  44         //(1)知道類的全路徑名,Class<?> clazz = Class.forName("類的全路徑名");  45         //(2)知道該類的一個對象 Class<?> clazz = 對象名.getClass();  46         //(3)知道類的名字: Class<?> clazz = 類名.class;
 47         System.out.println("----------獲取Person類的信息-------------");
 48         Person p = new Person();
 49         test(p);
 50         /*    test(p);打印結果如下
 51          *     ----------獲取Person類的信息-------------
 52             public java.lang.String cn.tx.Person.toString()
 53             public java.lang.String cn.tx.Person.getAddress()
 54             public java.lang.String cn.tx.Person.getName()
 55             public java.lang.Integer cn.tx.Person.getId()
 56             public void cn.tx.Person.setName(java.lang.String)
 57             public void cn.tx.Person.setId(java.lang.Integer)
 58             public void cn.tx.Person.setAddress(java.lang.String)
 59             -------------獲得類的所有聲明的屬性---------------
 60             private java.lang.Integer cn.tx.Person.id
 61             private java.lang.String cn.tx.Person.name
 62             private java.lang.String cn.tx.Person.address
 63             --------------獲得類的所有構造器--------------
 64             public cn.tx.Person()
 65             public cn.tx.Person(java.lang.Integer,java.lang.String,java.lang.String)
 66          * */
 67         //(3)
 68         
 69 
 70     }
 71     
 72     /**
 73      * Class<? extends Object> 
 74      * @param obj
 75      */
 76     public static void test(Object obj){
 77         //Class<? extends Object>表示通過反射獲取的對象的類型不確定,但是一定是Object類的子類
 78         //等價於Class<?> clazz = obj.getClass();
 79         Class<? extends Object> clazz = obj.getClass();
 80         // 2.獲得傳遞過來的類(上面的String類)的所有方法——目的就是為了調用獲得的方法
 81         Method[] methods = clazz.getDeclaredMethods();
 82         for (Method m : methods) {
 83             System.out.println(m);
 84         }
 85 
 86         // 3.獲得類的所有聲明的屬性——目的:設置屬性或者是獲取屬性值
 87         System.out.println("-------------獲得類的所有聲明的屬性---------------");
 88         Field[] fields = clazz.getDeclaredFields();
 89         for (Field field : fields) {
 90             System.out.println(field);
 91         }
 92 
 93         // 4.獲得類的所有構造器——創建對象
 94         System.out.println("--------------獲得類的所有構造器--------------");
 95         Constructor<?>[] constructors = clazz.getDeclaredConstructors();
 96         for (Constructor<?> constructor : constructors) {
 97             System.out.println(constructor);
 98         }
 99     }
100 
101 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM