友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第199章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




  

public class Frog {  

  private int jumps;  

  private Color color;  

  private Spots spots;  

  private boolean jmpr;  

  public int getJumps() { return jumps; }  

  public void setJumps(int newJumps) {   

    jumps = newJumps;  

  }  

  public Color getColor() { return color; }  

  public void setColor(Color newColor) {   



                                                                               457 


…………………………………………………………Page 459……………………………………………………………

    color = newColor;   

  }  

  public Spots getSpots() { return spots; }  

  public void setSpots(Spots newSpots) {  

    spots = newSpots;   

  }  

  public boolean isJumper() { return jmpr; }  

  public void setJumper(boolean j) { jmpr = j; }  

  public void addActionListener(  

      ActionListener l) {  

    //。。。  

  }  

  public void removeActionListener(  

      ActionListener l) {  

    // 。。。  

  }  

  public void addKeyListener(KeyListener l) {  

    // 。。。  

  }  

  public void removeKeyListener(KeyL istener l) {  

    // 。。。  

  }  

  // An 〃ordinary〃 public method:  

  public void croak() {  

    System。out。println(〃Ribbet!〃);  

  }  

} ///:~  

  

首先,我们可看到Bean 就是一个类。通常,所有我们的字段会被作为专用,并且可以接近的唯一办法是通过 

方法。紧接着的是命名规则,属性是jump,color,jumper,spots (注意这些修改是在第一个字母在属性名 

的情况下进行的)。虽然内部确定的名字同最早的三个例子的属性名一样,在jumper 中我们可以看到属性名 

不会强迫我们使用任何特殊的内部可变的名字(或者,真的拥有一些内部的可变的属性名)。  

Bean 事件的句柄是ActionEvent 和KeyEvent ,这是根据有关接收器的“add”和“remove”命名方法得出 

的。最后我们可以注意到普通的方法croak()一直是Bean 的一部分,仅仅是因为它是一个公共的方法,而不 

是因为它符合一些命名规则。  



13。18。2 用 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 信息的练 



                                                                                      458 


…………………………………………………………Page 460……………………………………………………………

习,好啦,闲话少说,这里有一个工具请运行它(我们可以在 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++) {  



                                                                                          459 


…………………………………………………………Page 461……………………………………………………………

      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 =   

        event
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!