解析jdk源码第一天

java.*   对外开放的开发接口,有向后兼容的特点;当有新版本的jdk时,旧版本的jdk依然可以正常运行。一般更新jdk的时候也不会更新

javax.*  也是java标准库的扩展,将这些东西弄成一个库是为了不让java标准库过大。一般的扩展包都是在这。

com.sun.*  是java.*和javax.*的实现类,一般不推荐使用这个包的类,因为其他jdk中的可能不会有这个包,那么就可能不会向后兼容。

org.omg.*   不是sun公司提供的,是企业或组织提供的类库,同样不具备向后兼容

1.当研究到jdk深入时,会经常遇到反射reflect和内省Introspector,使用

BeanInfo 和PropertyDescriptor和MethodDescriptor,BeanDescriptor,

    内省:是java对bean类属性、事件的一种缺省处理方法,例如:类a中的属性name,name可以通过get,set获取设置值,这就是默认的规则。java提供了api来调用get、set方法,这些api在java.beans中。

   public class test { 
    private String name;
    private String sex; 
    public void aTest(String name){ 
    } 
    public void getTest(){ 
    } 
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getName() {
        return name;
    } 
    public void setName(String name) {
        this.name = name;
    } 
    public static void main(String[] args) {
        test t=new test();
        t.setName("测试");
        t.setSex("性别");
        try {
            //获取对象的beaninfo信息,
            BeanInfo in= Introspector.getBeanInfo(t.getClass(),Object.class);
            //获取beaninfo中的属性描述
            PropertyDescriptor pd[]= in.getPropertyDescriptors();
            for (PropertyDescriptor p : pd) {
                //PropertyDescriptor是属性描述器,所以p.getReadMethod().invoke反射后返回的就是
                System.out.println(p.getName()+"="+p.getReadMethod().invoke(t, null));  
            } 
             MethodDescriptor[] md=in.getMethodDescriptors();
            for (MethodDescriptor m:md) {
                System.out.println(m.getName()); 
            } 

        } catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 
            e.printStackTrace();
        } 
    }
}

2.PropertyChangeSupport 和PropertyChangeListener来实现类对象的属性change监听事件

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;  

public class test {  
    PropertyChangeSupport pcs=new PropertyChangeSupport(this); 
    private String name="发现";
    private String sex="性别"; 
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        String old=this.sex;
        this.sex = sex; 
        pcs.firePropertyChange("sex", old, sex);
    }
    public String getName() {
        return name;
    } 
    public void setName(String name) { 
        String old=this.name;
        this.name = name; 
        pcs.firePropertyChange("name", old, name);
    } 
    //添加属性监听事件
    public void addPropertyChangeListenter(PropertyChangeListener listener){
        pcs.addPropertyChangeListener(listener);
    } 
    //删除属性监听事件
    public void rmPropertyChangeListenter(PropertyChangeListener listener){
        pcs.removePropertyChangeListener(listener);
    } 

public class MyRs{ 
    public static void main(String[] args) {
         test t=new test(); 
         t.addPropertyChangeListenter(new ChangeListener());
         t.setName("年就开始电脑");
    }
}

public class ChangeListener implements PropertyChangeListener{

 @Override
    public void propertyChange(PropertyChangeEvent evt) {
            System.out.println(evt.getPropertyName());
            System.out.println("NewValue=" + evt.getNewValue());
            System.out.println("OldValue=" + evt.getOldValue()); 
    }

}

上面的addPropertyChangeListenter和rmPropertyChangeListenter提供了随时注册和删除属性监听事件,一般在set值的时候执行firePropertyChange方法,这个方法会在PropertyChangeEvent中注册。

当实例化一个类对象时,调用通用方法addPropertyChangeListenter,然后在添加了监听之后再修改类的属性后,就会执行属性change事件PropertyChangeEvent,这里addPropertyChangeListenter可以是new PropertyChangeListenter接口,也可以新建一个类来实现PropertyChangeListener接口。

再上门的test类中,也可以不用自己写添加属性监听事件和删除属性事件,直接实现Customizer接口即可,然可以重写添加和删除属性改变事件。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值