在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
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文件看一下。
确实全是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预计也基本上就是这么用的了。