在JAVA_HOME/lib下面有两个比较重要的jar文件,tools.jar和dt.jar。

 

tools.jar在上篇文章中做了简单的介绍。这里来介绍下dt.jar。

在Oracle官方网站搜dt.jar,找到JDK and JRE File Structure这个页面,如下

​https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jdkfiles.html​

有如下的一段话

/jdk1.7.0/lib

Files used by the development tools. Includes ​​tools.jar​​​, which contains non-core classes for support of the tools and utilities in the JDK. Also includes ​​dt.jar​​, the DesignTime archive of BeanInfo files that tell interactive development environments (IDE's) how to display the Java components and how to let the developer customize them for an application.翻译一下:

/jdk1.7.0/lib

开发工具使用的文件。包括tools.jar和dt.jar。tools.jar包含支持JDK中各个工具的非核心的类。也包括dt.jar,dt.jar是设计时BeanInfo文件的归档,告诉可交互的开发环境如何显示Java的组件和如何让开发者自定义他们的应用程序。

dt.jar的解释中有两个点:

1.设计时(DesignTime)是跟运行时(Runtime)对象,简单点说就是一个是写程序的时候,一个是跑程序的时候。

2.BeanInfo文件,关于这个BeanInfo文件,我们可以打开dt.jar文件看一下。

JDK的dt.jar和Java BeanInfo接口_components

确实全是xxxBeanInfo的类。再仔细看一下,前面的XXX都是Swing的各个组价。

首先查找下BeanInfo是干啥的。

在Oracle官网查找BeanInfo,找下下面的页面,发现BeanInfo是个接口,

​https://docs.oracle.com/javase/7/docs/api/java/beans/BeanInfo.html​

先看下doc是怎么说的,下面是BeanInfo接口的Java Doc翻译,

public interface BeanInfo

一个bean的具体实现者,如果想提供关于这个bean的明确的信息,他可以提供一个实现了BeanInfo接口的BeanInfo类,来提供关于这个Bean的方法,属性,事件等的明确的信息。

一个Bean的实现者不需要提供一系列完整的明确的信息。你可以选择你想提供的信息,剩下的信息将通过低级的反射Bean类的方法和应用标准的设计模式自动分析来获取。

你有机会提供很多不同的信息作为XyZDescriptor类的一部分。但是不必惊慌,其实你只需要提供各个构造方法需要的最小限度的核心信息。

更形象的信息可以去查看BeanInfo接口的几个getter方法。JDK还提供了一个SimpleBeanInfo类,BeanInfo接口的一个简单的实现。可以简单看一下。

上面提到一句话,tools.jar和dt.jar都是给开发工具用的。下面看一下这套API是怎么用的。

首先写一个MyClass类

package com.highgo.test.beaninfo;

public class MyClass {
private String field1;

public String getField1() {
return field1;
}

public void setField1(String field1) {
this.field1 = field1;
}
}

在写一个MyClassBeanInfo类,注意这个类的命名,MyClass+BeanInfo

package com.highgo.test.beaninfo;


import java.awt.Image;
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;


public class MyClassBeanInfo implements BeanInfo{


@Override
public BeanDescriptor getBeanDescriptor() {
// TODO Auto-generated method stub
BeanDescriptor bd = new BeanDescriptor(MyClass.class);
bd.setName("MyName");
bd.setDisplayName("MyDisplayName");
bd.setShortDescription("Hi, My First BeanInfo Test!");
return bd;
}


@Override
public EventSetDescriptor[] getEventSetDescriptors() {
// TODO Auto-generated method stub
return new EventSetDescriptor[0];
}


@Override
public int getDefaultEventIndex() {
// TODO Auto-generated method stub
return 0;
}


@Override
public PropertyDescriptor[] getPropertyDescriptors() {
// TODO Auto-generated method stub
return new PropertyDescriptor[0];
}


@Override
public int getDefaultPropertyIndex() {
// TODO Auto-generated method stub
return 0;
}


@Override
public MethodDescriptor[] getMethodDescriptors() {
// TODO Auto-generated method stub
return new MethodDescriptor[0];
}


@Override
public BeanInfo[] getAdditionalBeanInfo() {
// TODO Auto-generated method stub
return new BeanInfo[0];
}


@Override
public Image getIcon(int iconKind) {
// TODO Auto-generated method stub
return null;
}


}

测试一下

import com.highgo.test.beaninfo.MyClass;

public class Test{
public static void main(String[] args) throws IntrospectionException {
BeanInfo bi2 = Introspector.getBeanInfo(MyClass.class);
System.out.println(bi2.getBeanDescriptor());
}
}

控制台

java.beans.BeanDescriptor[name=MyName; displayName=MyDisplayName; shortDescription=Hi, My First BeanInfo Test!; beanClass=class com.highgo.test.beaninfo.MyClass]

IDE估计也基本上就是这么用的了。