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 }
原文地址:https://www.cnblogs.com/enjoyjava/p/9135524.html