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

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

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");
    }


相关文章
|
1月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
71 3
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
66 2
|
1月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
37 2
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
58 15
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
24 1
|
2月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
43 5
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
55 2
|
2月前
|
Java C#
Java的监听处理事件--小球移动案例
Java的监听处理事件--小球移动案例
14 0
|
4月前
|
人工智能 Java 定位技术
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
这篇文章通过一个使用ChatGPT实现的Java扫雷小游戏案例,展示了ChatGPT在编程领域的应用能力。文章中包含了扫雷游戏的Java代码实现,代码中初始化了雷区地图,随机放置雷,计算每个格子周围雷的数量,并提供了一个简单的文本界面与用户交互进行游戏。游戏通过控制台输入接受玩家的指令,并给出相应的反馈。
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
|
4月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
41 2