java 反射 指定方法_Java学习day43-反射机制调用指定方法、指定属性

一、反射机制调用指定方法

通过反射,调用类中的方法,通过Method类完成。步骤:

1.通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。

2.之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。

packageday19;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest1 {public static voidmain(String[] args){try{

Class clazz= Class.forName("day19.Student");/*** 注意:下面不论是反射调用setInfo方法,还是test方法,都是调用的obj对象的方法,obj对象实际上就是student对象

**/Constructor con= clazz.getConstructor();//获取无参构造

Object obj = con.newInstance();//使用无参构造创建对象//如果想要调用一个公有的方法

Method m = clazz.getMethod("setInfo", String.class,String.class);//得到名称叫setInfo,参数是String,String的方法

m.invoke(obj, "张三","第一中学");//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数//如果想要调用一个私有的方法

Method m1 = clazz.getDeclaredMethod("test", String.class);//获取方法名为test,参数为一个String类型的方法

m1.setAccessible(true);//解除私有的封装,下面可以强制调用私有方法

m1.invoke(obj, "李四");//调用一个重载方法

Method m2 = clazz.getMethod("setInfo", int.class);//setInfo的重载方法

m2.invoke(obj, 10);//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数//调用有返回值的方法

Method m3 = clazz.getMethod("getSchool");//这是获取方法名为getSchool并且没有参数的方法

String school =(String)m3.invoke(obj);//调用有返回值,但是没有参数的方法

System.out.println(school);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

打印结果:

7d4e6dfe39a6fa491403693a87a419e9.png

二、反射机制调用指定属性

1.在反射机制中,可以直接通过Filed类操作类中的属性,通过Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。

2.public Field getField(String name) 返回此Class对象表示的类或接口的指定public的Field。

3.public Field getDeclaredField(String name)返回此Class对象表示的类或接口的指定的Field。

4.在Field中:

①public Object get(Object obj)取得指定对象obj上此Field的属性内容

②public void set(Object obj.Object value)设置指定对象obj上此Field的属性内容

注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAcessible(true)方法将需要操作的属性设置为可以被外部访问。

③public void setAccessible(true)访问私有属性时,让这个属性可见。

packageday19;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;public classTest1 {public static voidmain(String[] args){try{

Class clazz= Class.forName("day19.Student");//反射创建一个对象

Constructor con =clazz.getConstructor();

Student stu=(Student)con.newInstance();

Field f= clazz.getField("school");//获取名称为school的属性

f.set(stu,"第三中学");//对stu对象的school属性设置值“第三中学”

String school = (String)f.get(stu);//获取stu对象的school属性的值

System.out.println(school);//如果是私有属性

Field f1 = clazz.getDeclaredField("privateField");

f1.setAccessible(true);//解除私有的封装下面就可以强制调用这个属性

f1.set(stu,"测试私有属性");

System.out.println(f1.get(stu));

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

打印结果:

7d6a8bee8d701f1b2fc88b778fc760eb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值