java Introspector内省和Reflect反射学习、联系和区别

本文介绍了Java反射和内省的基本概念及应用,通过具体的代码示例展示了如何使用这两种技术来操作类的属性和方法,并对比了它们之间的联系与区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                        java Introspector内省和Reflect反射学习、联系和区别

 

一、反射和内省

1、反射: 将一个类中属性、方法拆解中一个个集合。 Methods[],Fields[]。 对于任意一个类,可以通过反射获取所有的属性和方法;对于任意一个对象可以通过反射调用任意一个方法。

2、内省: java提供的一套API,用于操作某个属性的getter/setter方方法。这些属性命名必须符合java bean命名规范。 (属性名的第二个字母是小写,则转getter/setter方法时,将第一个字母变成大写! 待确定!)

3、联系: 都是通过反射的原理来操作类的相关属性和方法。

4、区别: 反射是直接操作类的各种属性;内省是在反射的基础上进行了一次封装。如:使用内省获取属性值,肯定会调用 getter方法,而反射可以直接获取到。

 

二、代码示例

1、 定义一个普通的java类 User

/**
* description: 定义一个普通的java类,将采用反射reflect 和内省 introspector 进行测试调用
* @version v1.0
* @author w
* @date 2018年9月4日下午10:21:20
*/
public class User extends Person {
    private String name;
    private int age;
    // 省略 getter/setter

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

2、使用反射操作类的属性和方法

@Test
public void reflect() throws Exception{
    // 1.使用反射操作类的属性和方法
    User user = new User();
    Field nameF = user.getClass().getDeclaredField("name");
    nameF.setAccessible(true);
    nameF.set(user, "小明");

    Field ageF = User.class.getDeclaredField("age");
    ageF.setAccessible(true);
    ageF.set(user, 111);

    System.out.println("姓名:"+nameF.get(user)+" -- 年龄 :"+ageF.getInt(user));
}

 

3、.使用内省操作类的属性和方法

@Test
public void introspector() throws Exception{

    // 2.使用内省 PropertyDescriptor 操作类的属性和方法
    User user = new User();
    PropertyDescriptor pd = new PropertyDescriptor("name", User.class);

    // 等价于调用 setName() 方法
    Method writeMethod = pd.getWriteMethod();
    writeMethod.invoke(user, "晓红同学");

    // 等价于调用 setAge() 方法
    PropertyDescriptor pd2 = new PropertyDescriptor("age", User.class);
    Method writeMethod2 = pd2.getWriteMethod();
    writeMethod2.invoke(user, 18);

    // 等价于调用 getName() 和 getAge() 方法
    Method readMethod = pd.getReadMethod();
    Object name = readMethod.invoke(user);

    Method readMethod2 = pd2.getReadMethod();
    Object age = readMethod2.invoke(user);

    System.out.println("姓名2:"+name+" --- 年龄2:"+age);

    // 3.使用 Introspector 操作所有属性
    BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
    for (PropertyDescriptor p : propertyDescriptors) {
        // 获取所有属性,包含父类属性
        System.out.println(p);
        // xx do something
    }

    MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
    for (MethodDescriptor m : methodDescriptors) {
        // 获取所有方法,包含父类方法
        System.out.println(m.getDisplayName());
        // xx do something
    }
}

 

参考资料:https://www.cnblogs.com/winclpt/articles/7405271.html

                   Java内省机制

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值