反射_通过反射调用类中指定方法、属性

一、调用指定方法

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

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

2、使用Object invoke(Object obj,Object[ ] args)进行调用,并向方法中传递要设置的obj对象的参数信息。
在这里插入图片描述

说明:
1.Object 对应原方法的返回值,若原方法无返回值,此时返回null
2.若原方法若为静态方法,此时形参Object obj可为null
3.若原方法形参列表为空,则Object[] args为null
4.若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法。

/**
 * 调用运行时类中指定的方法
 */
@Test
public void test3() throws Exception {
    //1、创建运行时类
    Class clazz = Person.class;
    //2、创建Method对象
    Method m1 = clazz.getMethod("show");
    //3、创建运行时类所对应的对象
    Person p = (Person) clazz.newInstance();
    //4、调用方法
    m1.invoke(p);

    //私有方法
    Method m2 = clazz.getDeclaredMethod("display", String.class);
    m2.setAccessible(true);
    m2.invoke(p,"中国");
    
}

构造器

/**
 * 调用指定类型的构造器创建对象
 */
@Test
public void test4() throws Exception {
    String className = "Progress.reflection.Person";
    Class clazz = Class.forName(className);

    //private修饰的构造器
    Constructor con = clazz.getDeclaredConstructor(String.class, Integer.class);
    con.setAccessible(true);
    Person p = (Person) con.newInstance("小汐",34);
    System.out.println(p);
}

二、调用指定属性以及赋值
在反射机制中,可以直接通过Field类操作类中的属性,通过Field类提供的set( )和get( )方法就可以完成设置和取得属性类容的操作。

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

  • public Field getDeclareField(String name);返回此对象表示的类或接口的指定的Field。
    在Field中:

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

  • public void set(Object obj,Object value); 设置指定对象obj上此Field的属性内容。
    :在类中属性都设置为private的情况下,在使用set和get方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问。

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

/**
 * 调用运行时类中指定的属性
 */
@Test
public void test3() throws Exception {
    Class clazz = Person.class;
    //1、获取指定的属性
    //getField:这种写法是类的属性范围设置为public
    Field name = clazz.getField("name");
    //2、创建运行时类的对象
    Person p = (Person) clazz.newInstance();
    //3、将运行时类的指定的属性赋值
    name.set(p,"jerry");

    //getDeclaredField: 这种写法是类的属性范围设置为private

    Field age = clazz.getDeclaredField("age");
    age.setAccessible(true);
    age.set(p,34);
    System.out.println(p);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值