首页 > 代码库 > 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
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文件看一下。


确实全是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接口