首页 > 代码库 > JDK的dt.jar和Java BeanInfo接口
JDK的dt.jar和Java BeanInfo接口
在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估计也基本上就是这么用的了。
JDK的dt.jar和Java BeanInfo接口