java.beans.* 篇(1)Beans,BeanInfo,BeanDescriptor,Introspector,PropertyChangeSupport,EventHandler使用案例

本文详细介绍了Java Beans组件的使用,包括Beans的实例化、Introspector获取BeanInfo、MethodDescriptor和ParameterDescriptor的运用,以及PropertyChangeSupport、PropertyChangeListenerProxy、PropertyEditor和EventHandler的功能演示。通过实例代码展示了如何在Java中创建和管理Bean,以及监听和转换Bean属性。

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

java.beans.Beans 使用demo

 /**
     * @description: demos of jdk8 java.beans.Beans class
     * java.beans.Beans 作用:主要用来当作初始化bean 的工具,如下
     * 内部也是调用了 ClassFinder.findClass(beanName, cls);
     */
    @Test
    public void testBeans() throws IOException, ClassNotFoundException {

        User user = (User) Beans.instantiate(this.getClass().getClassLoader(), "com.foundation.one.jdk8.beans.User");
        System.out.println(user);
    }

java.beans.Introspector  & java.beans.BeanDescriptor &

java.beans.MethodDescriptor &

java.beans.ParameterDescriptor 使用demo

  /**
     * @description: demos of jdk8 java.beans.Introspector class
     * java.beans.Introspector 作用:主要用获取beanInfo 的工具,
     * beanInfo 是类class的描述,是一系列XXXDescriptor()的聚合根 ,省去了自己写反射去获取描述的逻辑
     * 下面是BeanDescriptor MethodDescriptor ParameterDescriptor 例子:
     */
    @Test
    public void testIntrospectorAndBeanInfo() throws IOException, ClassNotFoundException, IntrospectionException {


        //decapitalize 将大头字母变为小写,如果连续两个大写字母,则不变,类似于spring 初始化bean name的命名规则
        String decapitalize1 = Introspector.decapitalize("HaHa");
        String decapitalize2 = Introspector.decapitalize("HAHa");
        Assert.assertEquals(decapitalize1,"haHa");
        Assert.assertEquals(decapitalize2,"HAHa");

        //获取com.foundation.one.jdk8.beans.User 类beanInfo信息
        BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Introspector.USE_ALL_BEANINFO);

        //获取BeanDescriptor 相关信息
        BeanDescriptor beanDescriptor = beanInfo.getBeanDescriptor();
        System.out.println(beanDescriptor.getName());
        System.out.println(beanDescriptor.getDisplayName());
        System.out.println(beanDescriptor.getBeanClass());
        System.out.println(beanDescriptor.getCustomizerClass());

        //获取MethodDescriptor 相关信息
        MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
        for (MethodDescriptor methodDescriptor : methodDescriptors) {
            if (Objects.nonNull(methodDescriptor)) {
                System.out.println("method:" + methodDescriptor.getName());


                //获取ParameterDescriptor 相关信息 ,目前是需要各个系统实现这个方法的,默认方式如下获取会是null
                ParameterDescriptor parameterDescriptors[] = methodDescriptor.getParameterDescriptors();

                //parameterDescriptors 会是null,需要扩展实现,可使用params 获取,如下
                Parameter parameters[] = methodDescriptor.getMethod().getParameters();
                if (Objects.nonNull(parameters)) {
                    for (Parameter parameter : parameters) {
                        System.out.println("param:" + parameter.getType());
                    }
                }
            }
        }

    }

 输出结果:

class com.foundation.one.jdk8.beans.User
null
method:getClass
method:setId
param:class java.lang.Integer
method:wait
method:notifyAll
method:getId
method:notify
method:wait
param:long
param:int
method:getUsername
method:hashCode
method:setUsername
param:class java.lang.String
method:wait
param:long
method:equals
param:class java.lang.Object
method:toString

 java.beans.PropertyChangeSupport 使用demo

/**
 * @Author alan.wang
 * @Description: PropertyChangeSupport 测试类
 */
public class PropertyChangeSupportDemo {

    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.removePropertyChangeListener(listener);
    }

    private String value;

    private String id ;

    public String getValue() {
        return value;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.pcs.firePropertyChange("id",this.id,id);
        this.id = id;
    }

    public void setValue(String value) {
        this.pcs.firePropertyChange("value",this.value,value);
        this.value = value;
    }
}

/**
     * @description: demos of jdk8 java.beans.PropertyChangeSupport class
     * java.beans.PropertyChangeSupport 作用:主要用帮助类注册PropertyChangeListener 监听器
     * PropertyChangeListener 是一个接口,可以实现它作为某类的property 变动时触发的动作
     * PropertyChangeSupport ,PropertyChangeListener 例子:
     */
    @Test
    public void testPropertyChangeSupport(){

        PropertyChangeSupportDemo propertyChangeSupportDemo = new PropertyChangeSupportDemo();
        propertyChangeSupportDemo.addPropertyChangeListener((e)->{

            if(Objects.equals(e.getPropertyName(),"id")) {
                System.out.println("id old value:" + e.getOldValue());
                System.out.println("id new value:" + e.getNewValue());
            }else if(Objects.equals(e.getPropertyName(),"value")){
                System.out.println("value old value:" + e.getOldValue());
                System.out.println("value new value:" + e.getNewValue());
            }
        });
        propertyChangeSupportDemo.setId("1");
        System.out.println("-------------------break line---------------------------");
        propertyChangeSupportDemo.setId("2");
        System.out.println("-------------------break line---------------------------");
        propertyChangeSupportDemo.setValue("aaa");
        System.out.println("-------------------break line---------------------------");
        propertyChangeSupportDemo.setValue("bbb");
        System.out.println("-------------------break line---------------------------");

    }

输出结果 :

id old value:null
id new value:1
-------------------break line---------------------------
id old value:1
id new value:2
-------------------break line---------------------------
value old value:null
value new value:aaa
-------------------break line---------------------------
value old value:aaa
value new value:bbb
-------------------break line---------------------------

java.beans.PropertyChangeListenerProxy 使用demo

/**
     * @description: demos of jdk8 java.beans.PropertyChangeListenerProxy class
     * java.beans.PropertyChangeListenerProxy 作用:主要是增强PropertyChangeListener,可以直接注册时绑定属性
     * 这样就可以不做属性判定
     * PropertyChangeListenerProxy 例子:
     */
    @Test
    public void testPropertyChangeListenerProxy(){

        //可以配合上面例子使用,用来注册回调函数
        PropertyChangeSupportDemo propertyChangeSupportDemo = new PropertyChangeSupportDemo();
        EventHandlerDemo eventHandlerDemo = new EventHandlerDemo();

        //直接添加id属性的listener
        propertyChangeSupportDemo.addPropertyChangeListener(new PropertyChangeListenerProxy("id",(e -> {
            System.out.println("id old value:" + e.getOldValue());
            System.out.println("id new value:" + e.getNewValue());
        })));


        //直接添加value属性的listener
        propertyChangeSupportDemo.addPropertyChangeListener(new PropertyChangeListenerProxy("value",(e -> {
            System.out.println("value old value:" + e.getOldValue());
            System.out.println("value new value:" + e.getNewValue());
        })));

        propertyChangeSupportDemo.setId("1");
        System.out.println("-------------------break line---------------------------");

        propertyChangeSupportDemo.setValue("bbb");
    }

输出结果 :

id old value:null
id new value:1
-------------------break line---------------------------
value old value:null
value new value:bbb

java.beans.PropertyEditorManager 

java.beans.PropertyEditor 使用demo

 

/**
 * @Author alan.wang
 * @description: PropertyEditor 偶数类
 */
public class EvenNumber {

    public static final Class<EvenNumber>  TYPE = EvenNumber.class;

}
/**
 * @Author alan.wang
 * 进入后都会变成偶数,如果本身是偶数,则返回本身,如果不是偶数,则+1 返回
 */
public class EvenNumberPropertyEditorDemo extends PropertyEditorSupport {


    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        Integer evenNumber = Integer.parseInt(text);
        if(evenNumber%2==0){
            setValue(evenNumber);
        }else {
            setValue(evenNumber+1);
        }
    }
}
/**
     * @description: demos of jdk8 java.beans.PropertyEditor class
     * java.beans.PropertyEditor 作用:主要用是对一个值进行转换,变为另一个类型或者另一个值
     * 以下是对一个数进行转换,如果是偶数则返回本身,不是偶数则+1 返回
     * PropertyEditorManager PropertyEditor 例子:
     */
    @Test
    public void testPropertyEditor(){


        PropertyEditorManager.registerEditor(EvenNumber.TYPE,EvenNumberPropertyEditorDemo.class);

        EvenNumberPropertyEditorDemo evenNumberPropertyEditorDemo = (EvenNumberPropertyEditorDemo)PropertyEditorManager.findEditor(EvenNumber.TYPE);
        evenNumberPropertyEditorDemo.addPropertyChangeListener((evt -> {
            System.out.println(evenNumberPropertyEditorDemo.getValue());
        }));
        evenNumberPropertyEditorDemo.setAsText("100");
        evenNumberPropertyEditorDemo.setAsText("101");


    }

输出结果:

100
102

 

 

 java.beans.EventHandler 使用demo

/**
 * @Author alan.wang
 * @Desctiption: EventHandler demo 回调类
 */
public class EventHandlerDemo {

    public void print(String value) {
        System.out.println(value);
    }
}
 /**
     * @description: demos of jdk8 java.beans.EventHandler class
     * java.beans.EventHandler 作用:主要用帮助类创建一个回调类,节省了手动写注入并执行方法的代码
     * EventHandler 例子:
     */
    @Test
    public void testEventHandler(){

        //可以配合上面例子使用,用来注册回调函数
        PropertyChangeSupportDemo propertyChangeSupportDemo = new PropertyChangeSupportDemo();
        EventHandlerDemo eventHandlerDemo = new EventHandlerDemo();

        //不用EventHandler常规实现
        propertyChangeSupportDemo.addPropertyChangeListener(evt -> {
            eventHandlerDemo.print((String) evt.getNewValue());
        });

        propertyChangeSupportDemo.setValue("aaa");

        //EventHandler实现
        propertyChangeSupportDemo.addPropertyChangeListener(
                EventHandler.create(PropertyChangeListener.class,eventHandlerDemo,"print","newValue"));

        propertyChangeSupportDemo.setValue("bbb");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

峡谷电光马仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值