java 内省用法,及get,set方法获取

本文介绍如何使用Java反射API批量获取类的所有Get和Set方法,包括通过Introspector和PropertyDescriptor实现的方法。此外,还展示了如何通过属性名称直接获取特定属性的Get和Set方法,并提供了通过内省复制类实例的示例代码。

 示例:1获取类所有get,set方法

示例:2通过反射得到属性名称,获取属性get,set方法

// 获取所有类所有get set 方法
try {

            Store store= new Store();
            BeanInfo beanInfo = Introspector.getBeanInfo(Object.class);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor ptors:propertyDescriptors) {
                //读取get方法名  及内容
                System.out.println(ptors.getReadMethod().getName()+"*****"+ptors.getReadMethod().invoke(store,null));
                //读取set方法名  及设置值
                System.out.println(ptors.getWriteMethod().getName()+"****"+ptors.getWriteMethod().invoke(store));
            }
        }catch (Exception e){
            e.printStackTrace();
        }

   

 
//通过属性获取属性的get,set方法
    /**
     * 通过内省复制一个新的类
     * @param obj
     * @return
     * @throws Exception
     */
    public static <T> T copyModel(Object obj){
        T model = null;
        try {
            model = (T) obj.getClass().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return model;
        }
        try {
            PropertyDescriptor propertyDescriptor;
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field:fields) {
                propertyDescriptor = new PropertyDescriptor(field.getName(), obj.getClass());//创建一个属性描述器
                propertyDescriptor.getWriteMethod().invoke(model,propertyDescriptor.getReadMethod().invoke(obj));
            }
            return model;
        }catch (Exception e){
            return model;
        }
    }

 

### Java 内省与反射的概念及用法 #### 什么是反射? 反射是 Java 中的一种强大机制,允许程序在运行时动态地获取的信息,并通过这些信息操作的属性和方法。这意味着开发者可以在不知道具体名的情况下,加载并实例化某个的对象,调用其方法或者修改其字段值[^4]。 以下是使用反射的一个简单示例: ```java import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("java.util.ArrayList"); Method[] methods = clazz.getDeclaredMethods(); System.out.println("Methods in ArrayList:"); for (Method method : methods) { System.out.println(method.getName()); } } } ``` 这段代码展示了如何利用 `Class` 以及它的静态方法 `forName()` 来加载指定名称的,并通过该对象获得所有的声明方法列表。 --- #### 什么是内省内省是基于反射实现的技术,主要针对 JavaBeans 进行设计。它提供了一种更简便的方式来访问和操作 JavaBean 的属性及其对应的 getter 和 setter 方法。即使某些属性可能不存在实际定义(即只有 getset 方法),内省仍然会将其视为有效属性[^3]。 下面是一段展示如何使用内省技术的例子: ```java import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; public class IntrospectorExample { public static void main(String[] args) { try { PropertyDescriptor descriptor = new PropertyDescriptor("name", SampleBean.class); Object beanInstance = new SampleBean(); String oldValue = (String)descriptor.getReadMethod().invoke(beanInstance); // 调用getter System.out.println("Old Value: " + oldValue); descriptor.getWriteMethod().invoke(beanInstance, "New Name"); // 调用setter String newValue = (String)descriptor.getReadMethod().invoke(beanInstance); System.out.println("New Value: " + newValue); } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } static class SampleBean { private String name = "Default"; public String getName() { return this.name; } public void setName(String value) { this.name = value; } } } ``` 此例子说明了如何借助 `PropertyDescriptor` 对象读取或写入特定属性值的过程。 --- #### 反射 vs 内省 尽管两者都涉及到了对结构的操作,但它们之间存在显著区别: - **适用范围**:反射适用于任何型的;而内省专用于处理遵循 JavaBean 规范的。 - **易用程度**:由于内省封装了许多底层细节,因此对于标准 JavaBean 更加友好且易于上手。 - **性能影响**:无论是反射还是内省,在频繁使用的场景下都会带来一定的性能开销,应谨慎评估是否必要采用此方式解决问题。 --- #### 总结 Java 提供了两种不同的元编程工具——反射和内省。前者提供了极大的灵活性,能够适应各种复杂需求;后者则专注于简化常见的任务流程,特别是围绕着 JavaBeans 设计模式展开的工作流。理解两者的差异有助于选择最适合当前项目的解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔燚森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值