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


相关文章
|
10天前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
28 15
|
9天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
21 5
|
14天前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
34 2
|
12天前
|
Java C#
Java的监听处理事件--小球移动案例
Java的监听处理事件--小球移动案例
9 0
|
2月前
|
人工智能 Java 定位技术
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
这篇文章通过一个使用ChatGPT实现的Java扫雷小游戏案例,展示了ChatGPT在编程领域的应用能力。文章中包含了扫雷游戏的Java代码实现,代码中初始化了雷区地图,随机放置雷,计算每个格子周围雷的数量,并提供了一个简单的文本界面与用户交互进行游戏。游戏通过控制台输入接受玩家的指令,并给出相应的反馈。
人工智能ChatGPT 体验案例:使用ChatGPT实现java扫雷小游戏
|
2月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
32 2
|
2月前
|
安全 Java API
精通 Java 后台开发:案例分析与实践
精通 Java 后台开发:案例分析与实践
44 2
|
2月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
2月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
2月前
|
前端开发 Java 测试技术
综合案例【商品管理系统-Java基础版】(附完整源码)
综合案例【商品管理系统-Java基础版】(附完整源码)
116 9