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接口即可,然可以重写添加和删除属性改变事件。