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 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步