Java反射学习-3 - 反射获取属性,方法,构造器
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 * 三 、Class类中要掌握的方法: 9 * 反射获取具体属性、方法、构造器 10 * @author Administrator 11 * 12 */ 13 public class ReflectLearn3 { 14 15 public static void main(String[] args) throws Exception { 16 17 Class<?> clazz = Class.forName("cn.tx.reflect.Person"); 18 //1.反射获取类的属性值 19 Field field = clazz.getDeclaredField("address"); 20 System.out.println("反射获取到的类的属性信息为:" + field); 21 //打印结果: 反射获取到的类的属性信息为:private java.lang.String cn.tx.Person.address 22 //设置属性:首先获取对象 23 24 //2.反射获取方法:必须指定要获取的方法名和该方法的返回值类型,只靠方法名是不行的,还需要知道方法参数列表中的参数类型 25 /*Method java.lang.Class.getDeclaredMethod(String name, Class<?>... parameterTypes) 26 *Class<?>... 是可变参数,表示一个元素个数不确定的Class数组 */ 27 //Person类的getName()方法,没有形参,Class数组写new Class[]{} 28 Method method = clazz.getDeclaredMethod("getName", new Class[]{}); 29 System.out.println("获取到的getName()方法:"+method);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName() 30 Method method2 = clazz.getDeclaredMethod("setName", new Class[]{String.class}); //setName方法有一个String类型的形参 31 System.out.println("获取到的setName()方法:"+method2);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName() 32 33 //3.反射获取无参构造器Constructor<?> java.lang.Class.getDeclaredConstructor(Class<?>... parameterTypes) 34 Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[]{}); //参数为类的类对象数组 35 System.out.println(constructor); //打印public cn.tx.Person() 36 Constructor<?> constructor2 = clazz.getDeclaredConstructor(new Class[]{Integer.class,String.class,String.class}); 37 System.out.println(constructor2); //public cn.tx.Person(java.lang.Integer,java.lang.String,java.lang.String) 38 39 //4.使用构造器创建对象: Constructor类的public T newInstance(Object ... initargs) 40 Object object = constructor.newInstance(new Object[]{}); 41 System.out.println(object); //Person [address=null, id=null, name=null] 42 // Object object2 = constructor.newInstance(new Object[]{1,"李四","北京"}); 43 Object object2 = constructor2.newInstance(1,"李四","北京"); 44 System.out.println(object2);//Person [address=北京, id=1, name=李四] 45 46 //5.设置属性 47 //获得类的所有方法 48 Method[] methods = clazz.getDeclaredMethods(); 49 for (Method m : methods) { 50 //获得方法的名字; 51 String name = m.getName(); // 在这一行打断点,F6单步调试,查看反射掉调用过程 52 if(name.startsWith("set")){ 53 //获得set字符串后面的值 54 String fieldName = name.substring(3); 55 //获得属性名 56 fieldName = fieldName.substring(0,1).toLowerCase()+ fieldName.substring(1); 57 //获得方法对应的属性 58 Field field2 = clazz.getDeclaredField(fieldName);//注意,不是getField() 59 //获得属性对应的具体类型 60 Class<?> type = field2.getType(); 61 if(type == Integer.class){ 62 //通过method对象反射调用Person类的方法,第一个参数是调用方法的对象,第二个参数是方法的实参值 63 m.invoke(object2, 2); //相当于person.setId(2) 64 } 65 if(type == String.class && "address".equals(fieldName)){ 66 m.invoke(object2, "南京"); 67 } 68 if(type == String.class && "name".equals(fieldName)){ 69 m.invoke(object2, "tom"); 70 } 71 } 72 } 73 74 //6.直接设置属性:field.setAccessible(true) 75 Field field2 = clazz.getDeclaredField("name"); 76 field2.setAccessible(true);//让私有的属性可以被访问 77 field2.set(object2, "marry"); 78 System.out.println(object2); 79 80 } 81 }
结果如下:
原文地址:https://www.cnblogs.com/enjoyjava/p/9135556.html