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

办法查找工具[Java编程]

赞助商链接



  本文“办法查找工具[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
第11章介绍了Java 1.1新的“反射”概念,并操纵这个概念查询一个特定类的办法——要末是由全部办法构成的一个完好列表,要末是这个列表的一个子集(名字与我们指定的关键字符合).那个例子最大的好处就是能自动显示出全部办法,不逼迫我们在担当构造中遍历,查抄每一级的底子类.所以,它实际是我们节俭编程时间的一个有效工具:因为大大都Java办法的名字都规定得非常全面和细致,所以能有效地找出那些包含了一个特别关键字的办法名.若找到符合尺度的一个名字,便可按照它直接查阅联机帮忙文档.
但第11的那个例子也有缺陷,它没有利用AWT,仅是一个纯号令行的利用.在这儿,我们预备制作一个改良的GUI版本,能在我们键入字符的时刻自动革新输出,也答应我们在输出后果中举行剪切和粘贴操作:

//: DisplayMethods.java
// Display the methods of any class inside
// a window. Dynamically narrows your search.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.reflect.*;
import java.io.*;

public class DisplayMethods extends Applet {
  Class cl;
  Method[] m;
  Constructor[] ctor;
  String[] n = new String[0];
  TextField 
    name = new TextField(40),
    searchFor = new TextField(30);
  Checkbox strip = 
    new Checkbox("Strip Qualifiers");
  TextArea results = new TextArea(40, 65);
  public void init() {
    strip.setState(true);
    name.addTextListener(new NameL());
    searchFor.addTextListener(new SearchForL());
    strip.addItemListener(new StripL());
    Panel 
      top = new Panel(),
      lower = new Panel(),
      p = new Panel();
    top.add(new Label("Qualified class name:"));
    top.add(name);
    lower.add(
      new Label("String to search for:"));
    lower.add(searchFor);
    lower.add(strip);
    p.setLayout(new BorderLayout());
    p.add(top, BorderLayout.NORTH);
    p.add(lower, BorderLayout.SOUTH);
    setLayout(new BorderLayout());
    add(p, BorderLayout.NORTH);
    add(results, BorderLayout.CENTER);
  }
  class NameL implements TextListener {
    public void textValueChanged(TextEvent e) {
      String nm = name.getText().trim();
      if(nm.length() == 0) {
        results.setText("No match");
        n = new String[0];
        return;
      }
      try {
        cl = Class.forName(nm);
      } catch (ClassNotFoundException ex) {
        results.setText("No match");
        return;
      }
      m = cl.getMethods();
      ctor = cl.getConstructors();
      // Convert to an array of Strings:
      n = new String[m.length + ctor.length];
      for(int i = 0; i < m.length; i++)
        n[i] = m[i].toString();
      for(int i = 0; i < ctor.length; i++)
        n[i + m.length] = ctor[i].toString();
      reDisplay();
    }
  }
  void reDisplay() {
    // Create the result set:
    String[] rs = new String[n.length];
    String find = searchFor.getText();
    int j = 0;
    // Select from the list if find exists:
    for (int i = 0; i < n.length; i++) {
      if(find == null)
        rs[j++] = n[i];
      else if(n[i].indexOf(find) != -1)
          rs[j++] = n[i];
    }
    results.setText("");
    if(strip.getState() == true)
      for (int i = 0; i < j; i++)
        results.append(
          StripQualifiers.strip(rs[i]) + "\n");
    else // Leave qualifiers on
      for (int i = 0; i < j; i++)
        results.append(rs[i] + "\n");
  }
  class StripL implements ItemListener {
    public void itemStateChanged(ItemEvent e) {
      reDisplay();
    }
  }
  class SearchForL implements TextListener {
    public void textValueChanged(TextEvent e) {
      reDisplay();
    }
  }
  public static void main(String[] args) {
    DisplayMethods applet = new DisplayMethods();
    Frame aFrame = new Frame("Display Methods");
    aFrame.addWindowListener(
      new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          System.exit(0);
        }
      });
    aFrame.add(applet, BorderLayout.CENTER);
    aFrame.setSize(500,750);
    applet.init();
    applet.start();
    aFrame.setVisible(true);
  }
}

class StripQualifiers {
  private StreamTokenizer st;
  public StripQualifiers(String qualified) {
      st = new StreamTokenizer(
        new StringReader(qualified));
      st.ordinaryChar(' ');
  }
  public String getNext() {
    String s = null;
    try {
      if(st.nextToken() !=
            StreamTokenizer.TT_EOF) {
        switch(st.ttype) {
          case StreamTokenizer.TT_EOL:
            s = null;
            break;
          case StreamTokenizer.TT_NUMBER:
            s = Double.toString(st.nval);
            break;
          case StreamTokenizer.TT_WORD:
            s = new String(st.sval);
            break;
          default: // single character in ttype
            s = String.valueOf((char)st.ttype);
        }
      }
    } catch(IOException e) {
      System.out.println(e);
    }
    return s;
  }
  public static String strip(String qualified) {
    StripQualifiers sq = 
      new StripQualifiers(qualified);
    String s = "", si;
    while((si = sq.getNext()) != null) {
      int lastDot = si.lastIndexOf('.');
      if(lastDot != -1)
        si = si.substring(lastDot + 1);
      s += si;
    }
    return s;
  }
} ///:~

程序中的有些东西已在从前见识过了.和本书的很多GUI程序一样,这既可作为一个独立的利用程序利用,亦可作为一个程序片(Applet)利用.此外,StripQualifiers类与它在第11章的表现是完好一样的.
GUI包含了一个名为name的“文本字段”(TextField),或在此中输入想查找的类名;还包含了另一个文本字段,名为searchFor,可挑选性地在此中输入一定的文字,但愿在办法列表中查找那些文字.Checkbox(复选框)答应我们指出终究但愿在输出中利用完好的名字,还是将前面的各种限定信息删去.最后,后果显示于一个“文本区域”(TextArea)中.
大家会注意到这个程序未利用任何按钮或其他组件,不能用它们开始一次搜索.这是由于无论文本字段还是复选框城市遭到它们的“侦听者(Listener)对象的监督.只要作出一项改变,后果列表便会当即更新.若改变了name字段中的文字,新的文字就会在NameL类中捕捉.若文字不为空,则在Class.forName()顶用于尝试查找类.当然,在文字键入期间,名字大概会变得不完好,而Class.forName()会失利,这意味着它会“掷”出一个违例.该违例会被捕捉,TextArea会随之设为“Nomatch”(没有符合).但只要键入了一个精确的名字(大小写也算在内),Class.forName()就会成功,而getMethods()和getConstructors()会辨别返回由Method和Constructor对象构成的一个数组.这些数组中的每个对象城市通过toString()改变成一个字串(这样便产生了完好的办法或构建器签名),并且两个列表城市归并到n中——一个独立的字串数组.数组n属于DisplayMethods类的一名成员,并在调用reDisplay()时用于显示的更新.
若改变了Checkbox或searchFor组件,它们的“侦听者”会简单地调用reDisplay().reDisplay()会成立一个暂时数组,此中包含了名为rs的字串(rs代表“后果集”——Result Set).后果集要末直接从n复制(没有find关键字),要末挑选性地从包含了find关键字的n中的字串复制.最后会查抄strip Checkbox,看看用户是不是但愿将名字中多余的部份删除(默许为“是”).若答案是必定的,则用StripQualifiers.strip()做这件事情;反之,就将列表简单地显示出来.
在init()中,大家大概认为在设置筹划时需求举行大量沉重的工作.事实上,组件的安置完好大概只需求极少的工作.但象这样利用BorderLayout的好处是它答应用户改变窗口的大小,并分外能使TextArea(文本区域)更大一些,这意味着我们可以改变大小,以便毋需转动便可看到更长的名字.
编程时,大家会发现分外有必要让这个工具处于运行状况,因为在试图判断要调用什么办法的时刻,它供应了最好的办法之一.
  以上是“办法查找工具[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 办法查找工具
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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