java反射 获取属性_Java反射学习-3 - 反射获取属性,方法,构造器

1 packagecn.tx.reflect;2

3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 importjava.lang.reflect.Method;6 importjava.util.Arrays;7 /**

8 * 三 、Class类中要掌握的方法:9 * 反射获取具体属性、方法、构造器10 *@authorAdministrator11 *12 */

13 public classReflectLearn3 {14

15 public static void main(String[] args) throwsException {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.address22 //设置属性:首先获取对象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", newClass[]{});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(newObject[]{});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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值