当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

用Introspector提取BeanInfo[Java编程]

赞助商链接



  本文“用Introspector提取BeanInfo[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
当我们拖放一个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);
  }
} ///:~

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调用办法,即便我们除了对象外没有任何别的的信息(此外,这也是映象的特点).
  以上是“用Introspector提取BeanInfo[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 用Introspector提取BeanInfo
  • MySQL时间字段毕竟利用INT还是DateTime
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .