用Introspector提取BeanInfo
当前位置:以往代写 > JAVA 教程 >用Introspector提取BeanInfo
2019-06-14

用Introspector提取BeanInfo

用Introspector提取BeanInfo

当我们拖放一个Bean的调色板并将它放入到窗体中时,一个Bean的最要害的部门的法则产生了。应用措施构建东西必需可以建设Bean(假如它是默认的构建器的话,它就可以做)然后,在此范畴外会见Bean的源代码,提取所有的须要的信息以创建属性表和事件处理惩罚器。
办理方案的一部门在11章末了部门已经显现出来:Java 1.1版的映象答允一个匿名类的所有要领被发明。这完美地办理了Bean的困难而无需我们利用一些非凡的语言要害字像在其它的可视化编程语言中所需要的那样。事实上,一个主要的原因是映象增加到Java 1.1版中以支持Beans(尽量映象同样支持工具串联和长途要领挪用)。因为我们大概但愿应用措施构建东西的开拓者将不得不映象每个Bean而且通过它们的要领搜索以找到Bean的属性和事件。
这虽然是大概的,可是Java的研制者们但愿为每个利用它的用户提供一个尺度的接口,而不只仅是使Bean更为简朴易用,不外他们也同样提供了一个建设更巨大的Bean的尺度要领。这个接口就是Introspector类,在这个类中最重要的要领静态的getBeanInfo()。我们通过一个类处理惩罚这个要领而且getBeanInfo()要领全面地对类举办查询,返回一个我们可以举办具体研究以发明其属性、要领和事件的BeanInfo工具。
凡是我们不会寄望这样的一些事物——我们大概会利用我们大大都的现成的Bean,而且我们不需要相识所有的在底层运行的技能细节。我们会简朴地拖放我们的Bean到我们窗体中,然后设置它们的属性而且为事件编写处理惩罚器。无论如何它都是一个有趣的而且是有教诲意义的利用Introspector来显示关于Bean信息的操练,好啦,闲话少说,这里有一个东西请运行它(我们可以在forgbean子目次中找到它):
 

//: BeanDumper.java
// A method to introspect a Bean
import java.beans.*;
import java.lang.reflect.*;

public class BeanDumper {
  public static void dump(Class bean){
    BeanInfo bi = null;
    try {
      bi = Introspector.getBeanInfo(
        bean, java.lang.Object.class);
    } catch(IntrospectionException ex) {
      System.out.println("Couldn't introspect " +
        bean.getName());
      System.exit(1);
    }
    PropertyDescriptor[] properties = 
      bi.getPropertyDescriptors();
    for(int i = 0; i < properties.length; i++) {
      Class p = properties[i].getPropertyType();
      System.out.println(
        "Property type:\n  " + p.getName());
      System.out.println(
        "Property name:\n  " + 
        properties[i].getName());
      Method readMethod = 
        properties[i].getReadMethod();
      if(readMethod != null)
        System.out.println(
          "Read method:\n  " + 
          readMethod.toString());
      Method writeMethod = 
        properties[i].getWriteMethod();
      if(writeMethod != null)
        System.out.println(
          "Write method:\n  " +
          writeMethod.toString());
      System.out.println("====================");
    }
    System.out.println("Public methods:");
    MethodDescriptor[] methods =
      bi.getMethodDescriptors();
    for(int i = 0; i < methods.length; i++)
      System.out.println(
        methods[i].getMethod().toString());
    System.out.println("======================");
    System.out.println("Event support:");
    EventSetDescriptor[] events = 
      bi.getEventSetDescriptors();
    for(int i = 0; i < events.length; i++) {
      System.out.println("Listener type:\n  " +
        events[i].getListenerType().getName());
      Method[] lm = 
        events[i].getListenerMethods();
      for(int j = 0; j < lm.length; j++)
        System.out.println(
          "Listener method:\n  " +
          lm[j].getName());
      MethodDescriptor[] lmd = 
        events[i].getListenerMethodDescriptors();
      for(int j = 0; j < lmd.length; j++)
        System.out.println(
          "Method descriptor:\n  " +
          lmd[j].getMethod().toString());
      Method addListener = 
        events[i].getAddListenerMethod();
      System.out.println(
          "Add Listener Method:\n  " +
        addListener.toString());
      Method removeListener =
        events[i].getRemoveListenerMethod();
      System.out.println(
        "Remove Listener Method:\n  " +
        removeListener.toString());
      System.out.println("====================");
    }
  }
  // Dump the class of your choice:
  public static void main(String[] args) {
    if(args.length < 1) {
      System.err.println("usage: \n" +
        "BeanDumper fully.qualified.class");
      System.exit(0);
    }
    Class c = null;
    try {
      c = Class.forName(args[0]);
    } catch(ClassNotFoundException ex) {
      System.err.println(
        "Couldn't find " + args[0]);
      System.exit(0);
    }
    dump(c);
  }
} ///:~

#p#分页标题#e#

BeanDumper.dump()是一个可以做任何事情的要领。首先它试图建设一个BeanInfo工具,假如乐成地挪用BeanInfo的要领,就发生关于属性、要领和事件的信息。在Introspector.getBeanInfo()中,我们会留意到有一个别的的自变量。由它来通知Introspector会见担任体系的所在。在这种环境下,它在阐明所有工具要领前停下,因为我们对看到那些并不感乐趣。
因为属性,getPropertyDescriptors()返回一组的属性描写标记。对付每个描写标记我们可以挪用getPropertyType()要领彻底的通过属性要领发明类的工具。这时,我们可以用getName()要领获得每个属性的化名(从要领名中提取),getname()要领用getReadMethod()和getWriteMethod()完成读和写的操纵。最后的两个要领返回一个可以真正地用来挪用在工具上挪用相应的要领要领工具(这是映象的一部门)。对付民众要领(包罗属性要领),getMethodDescriptors( )返回一组要领描写字符。每一个我们都可以获得相当的要领工具并可以显示出它们的名字。
对付事件而言,getEventSetDescriptors()返回一组事件描写字符。它们中的每一个都可以被查询以找出吸收器的类,吸收器类的要领以及增加和删除吸收器的要领。BeanDumper措施打印出所有的这些信息。
假如我们挪用BeanDumper在Frog类中,就像这样:
java BeanDumper frogbean.Frog
它的输出功效如下(已删除这儿不需要的特别细节):
 

class name: Frog
Property type:
  Color
Property name:
  color
Read method:
  public Color getColor()
Write method:
  public void setColor(Color)
====================
Property type:
  Spots
Property name:
  spots
Read method:
  public Spots getSpots()
Write method:
  public void setSpots(Spots)
====================
Property type:
  boolean
Property name:
  jumper
Read method:
  public boolean isJumper()
Write method:
  public void setJumper(boolean)
====================
Property type:
  int
Property name:
  jumps
Read method:
  public int getJumps()
Write method:
  public void setJumps(int)
====================
Public methods:
public void setJumps(int)
public void croak()
public void removeActionListener(ActionListener)
public void addActionListener(ActionListener)
public int getJumps()
public void setColor(Color)
public void setSpots(Spots)
public void setJumper(boolean)
public boolean isJumper()
public void addKeyListener(KeyListener)
public Color getColor()
public void removeKeyListener(KeyListener)
public Spots getSpots()
======================
Event support:
Listener type:
  KeyListener
Listener method:
  keyTyped
Listener method:
  keyPressed
Listener method:
  keyReleased
Method descriptor:
  public void keyTyped(KeyEvent)
Method descriptor:
  public void keyPressed(KeyEvent)
Method descriptor:
  public void keyReleased(KeyEvent)
Add Listener Method:
  public void addKeyListener(KeyListener)
Remove Listener Method:
  public void removeKeyListener(KeyListener)
====================
Listener type:
  ActionListener
Listener method:
  actionPerformed
Method descriptor:
  public void actionPerformed(ActionEvent)
Add Listener Method:
  public void addActionListener(ActionListener)
Remove Listener Method:
  public void removeActionListener(ActionListener)
====================

这个功效展现出了Introspector在从我们的Bean发生一个BeanInfo工具时看到的大部门内容。我们可留意到属性的范例和它们的名字是彼此独立的。请留意小写的属性名。(当属性名开头在一行中有高出不止的大写字母,这一次措施就不会被执行。)而且请记着我们在这里所见到的要领名(譬喻读和与要领)真正地从一个可以被用来在工具中挪用相关要领的要领工具中发生。
通用要领列表包括了不相关的事件可能属性,譬喻croak()。列表中所有的要领都是我们可以有打算的为Bean挪用,而且应用措施构建东西可以选择列出所有的要领,当我们挪用要领时,减轻我们的任务。
最后,我们可以看到事件在吸收器中完全地阐明研究它的要领、增加和淘汰吸收器的要领。根基上,一旦我们拥有BeanInfo,我们就可以找出对Bean来说任何重要的事物。我们同样可觉得Bean挪用要领,纵然我们除了工具外没有任何其它的信息(另外,这也是映象的特点)。

    关键字:

在线提交作业