java查询类提供的方法_查询一个类的方法和构建器的JAVA程序
查詢一個類的方法和構建器的JAVA程序
JAVA語言的類庫中的類不計其數,其中設計的方法更是不勝其多,這是任何一個教科書——無論它是多么詳盡——所不能窮盡的。如果我們要使用某個類,要查詢它的構建器的用法,它有哪些方法可供使用,這可以查閱JDK
API文檔。但是,JDK文檔查起來也不很容易,特別是我們只要查一下某個類的某方法用的是什么參數表,去打開JDK文檔并查到那個類的位置,就已經化了不少時間。以前我們編寫了一個在命令行上查詢所用方法的程序,今天我們要介紹的是一個在WINDOWS視窗模式的類的方法的構建器的查詢程序,給出它的源代碼和詳細講解。
一 視窗的設計
程序運行時的視窗截面如圖所示:
右邊前兩個文本框用來輸入類名和包名,下面跟著的組合框提供一些常見的包名和類名,可以快速查詢一減少輸入。第三個文本框用來輸入方法名中的一段,一次過濾掉不含該片段的方法。例如,你輸入add,則輸出所有add開頭的方法(當然也包括XXXaddXXX的方法)。這樣可直擊要找的目標。點擊[方法]按鈕就在左邊的文本區中顯示匹配的方法,點擊[構建器]按鈕就顯示所有的構建器。
1 組件的設計
主程序的類名為ConstractorMethods。先聲明要使用的組件(如圖):
三個標簽JLabel lb1
,lb2, lb3。三個文本框tf1, tf2,
tf3。兩個組合框JComboBox cb,
cb1。三個按鈕JButton
method = new JButton ("方法"),
contrl = new JButton ("構造器"),
exit = new JButton
("退出");
還有左邊的一個文本區JTextArea
tA。它上方的標簽是后來增加的,所以是在init()方法中加入的。另外還定義了組合框中使用的字符串數組。
2
初始化——把組件安裝到面版上
這一工作是在init()方法中完成的。先用Container cp
= getContentPane();生成一個內容面版,其他東西都將放在其上。右邊的組件為了排列整齊,定義了一個面版JPanel
jp,它被設計為網格布局GridLayout(11,1),一列十一行。其中有兩個按鈕放在同一網格中,所以需要將它們先置入一個面版JPanel
jp1中。左邊的文本區等兩個組件放入面版jp0 中。最后,把jp0
和 jp 安裝到cp面版上,用流式布局。
init()中另一項工作是給兩個組合框加入元素——項。即有循環語句執行
cb.addItem(items[i]); 和cb1.addItem(usaful[i]);
用init做為方法名,本程序如果改為從JApplet繼承,就可以很容易轉化為APPLET程序了。Init()會自動得到調用。也可以把它改為一個構建器,在創建新實例時生成這樣的窗口。
最后寫上main()方法,上述窗口就可以在運行中顯示了。Main中的
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
的功能是:在窗口關閉時退回到WINDOWS,即本程序的入口處。
//
ConstractorMethods.java
import
javax.swing.*;
import
javax.swing.event.*;
import
java.awt.*;
import
java.awt.event.*;
import
java.lang.reflect.*;
import
java.util.regex.*;
public class
ConstractorMethods extends JFrame{
private
JButton
method = new JButton ("方法"),
contrl = new JButton ("構造器"),
exit = new JButton
("退出");
private
JLabel
lb1
= new JLabel("選擇包名"),
lb2
= new JLabel("輸入類名"),
lb3
= new JLabel("方法名片段");
private
JTextField
tf1
= new JTextField("java.lang",6), // 包名
tf2
= new JTextField("String",6), // 類名
tf3
= new JTextField(6);
private JComboBox cb =
new JComboBox();
private JComboBox cb1
= new JComboBox();
private JTextArea tA=
new JTextArea(14,26);
private static
String[] items = {
"java.lang","java.io","java.util","java.nio",
"java.awt","java.applet","javax.swing",
"java.awt.event","javax.swing.event","java.lang.reflect",
"java.util.regex"
};
private static
String[] usaful = {
"String","StringBuffered","Arrays",
"FileInputStream","BufferedOutputStream",
"ActionEvent","File","List","JTextArea","JApplet"
};
public void
init(){
Container cp =
getContentPane();
JPanel jp = new
JPanel();
for(int i=0;
i
cb.addItem(items[i]);
for(int i=0;
i
cb1.addItem(usaful[i]);
jp.setLayout(new
GridLayout(11,1));
jp.add(lb2 );
jp.add(tf2); jp.add(cb1);
jp.add(lb1 );
jp.add(tf1); jp.add(cb);
jp.add(lb3 );
jp.add(tf3);
JPanel jp1 = new
JPanel(new FlowLayout());
jp1.add(method);
jp1.add(contrl);
jp.add(jp1);
jp.add(exit);
JLabel lb = new
JLabel("顯示類的方法和構建器:");
lb.setFont(new
Font("MS serif", 0 ,20));
JPanel jp0 = new
JPanel(new BorderLayout());
jp0.add(lb,
"North");
jp0.add(new
JScrollPane(tA),"South");
cp.setLayout(new
FlowLayout());
cp.add(jp0);
cp.add(jp);
Font myFont = new
Font( "MS serif", 1 ,16) ;
tA.setFont( myFont)
;
tf1.setFont( myFont)
;
tf2.setFont( myFont)
;
tf3.setFont( myFont)
;
}
public static
void main(String[] args) {
ConstractorMethods
myFrame = new ConstractorMethods();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.init();
myFrame.setTitle("查詢某類的方法");
myFrame.setSize(500,
430);
myFrame.setLocation(200,200);
myFrame.setVisible(true);
}
二
事件監聽器的設計
1
組合框有選擇時的響應
當類名組合框有選擇時,在文本框中顯示被選中的項(字符串)。所以監聽器類cbL采用活動監聽器,只需要一條語句:
tf1.setText((String)cb.getSelectedItem());
監聽器類cb1完全類似。
class cbL
implements ActionListener{
public void
actionPerformed(ActionEvent e){
tf1.setText((String)cb.getSelectedItem());
}
}
class cb1L implements
ActionListener{
public void
actionPerformed(ActionEvent e){
tf2.setText((String)cb1.getSelectedItem());
}
}
2
兩個按鈕的監聽器
方法按鈕的監聽器將根據類名和關鍵詞來生成一個方法的列表。生成列表是本持續的核心代碼,我們有一個函數——getMethods(類名,關鍵詞)來實現。因此,按鈕的監聽器任務是從文本框中得到類名和關鍵詞,并以此調用getMethods方法。
獲得構造器的函數為getConstructors(String
className),不用關鍵詞。
class methodL
implements ActionListener{
public void
actionPerformed(ActionEvent e){
String sName = tf1.getText() + "." + tf2.getText();
String key = tf3.getText();
getMethods(sName, key);
}
}
class contrlL
implements ActionListener{
public void
actionPerformed(ActionEvent e){
String sName = tf1.getText() + "." + tf2.getText();
getConstructors(sName);
}
}
class exitL implements
ActionListener{
public void
actionPerformed(ActionEvent e){
if(e.getSource().equals((Object)exit))
System.exit(0);
}
}
三
獲取方法列表的函數的代碼
方法getMethods(String
className,String
keyWord)有兩個參數,一是類名,二是關鍵詞。類名現有兩個文本框的文字相加而成。一開始定義了一個Pattern
qualifier,它由正則表達式“java.lang.String,匹配的是java.和lang.找出它們是為了把它挖掉,即用空字符串替換之。這樣可使輸出的方法聲明中參數前的包名刪除掉,使顯示簡明易讀。
下一步是定義一個Class
對象
klass,由字符串的類名通過靜態方法forName得到類klass,并進一步得到它的全體方法methods(類型為Method[])。如果不需要過濾和簡化,現在就可以在文本區顯示它們了。
先行過濾,在methods[i]中找出包含keyWord的那些方法:
if(methods[i].toString().indexOf(keyWord)
!= -1)
找出有圓點及其前面字符的匹配項:
Matcher matcher =
qualifier.matcher(methods[i].toString());
挖掉圓點及其前面的字符,并加入到文本區中。:
if(matcher.find())
tA.append(matcher.replaceAll("")
+ "\n");
下面是這兩個函數的代碼全文。
public void
getMethods(String className,String keyWord){
Pattern qualifier =
Pattern.compile("\\w+\\.");
Class
klass;
try
{
klass =
Class.forName(className);
}
catch(ClassNotFoundException ex) {
tA.setText("No such class");
return;
}
Method[]
methods = klass.getMethods();
tA.setText("");
for(int i =
0; i < methods.length; i++) {
if(methods[i].toString().indexOf(keyWord)
!= -1){
Matcher matcher =
qualifier.matcher(methods[i].toString());
if(matcher.find())
tA.append(matcher.replaceAll("") + "\n");
}
}
}
public void
getConstructors(String className){
Pattern qualifier =
Pattern.compile("\\w+\\.");
Class
klass;
try
{
klass =
Class.forName(className);
}
catch(ClassNotFoundException ex) {
tA.setText("No such class");
return;
}
Constructor[]
ctor = klass.getConstructors();
tA.setText("");
for(int i =
0; i < ctor.length; i++) {
Matcher matcher =
qualifier.matcher(ctor[i].toString());
if(matcher.find())
tA.append(matcher.replaceAll("") + "\n");
}
}
四 添加監聽器并運行
最后,需要把各個監聽器加入到相應的組件中,即把下列代碼加入到init()中的適當位置(前后沒有多大關系):
cb.addActionListener(new
cbL());
cb1.addActionListener(new
cb1L());
method.addActionListener(new
methodL());
contrl.addActionListener(new
contrlL());
exit.addActionListener(new
exitL());
存盤后就可以便宜和運行了。
五 源代碼全文
//
查閱指定類的構造器和所有方法
//
類名和搜索用關鍵詞可從文本框輸入
//
ConstractorMethods.java
import
javax.swing.*;
import
javax.swing.event.*;
import
java.awt.*;
import
java.awt.event.*;
import
java.lang.reflect.*;
import
java.util.regex.*;
public class
ConstractorMethods extends JFrame{
private
JButton
method = new JButton ("方法"),
contrl = new JButton ("構造器"),
exit = new JButton
("退出");
private
JLabel
lb1
= new JLabel("選擇包名"),
lb2
= new JLabel("輸入類名"),
lb3
= new JLabel("方法名片段");
private
JTextField
tf1
= new JTextField("java.lang",6), // 包名
tf2
= new JTextField("String",6), // 類名
tf3
= new JTextField(6);
private JComboBox cb =
new JComboBox();
private JComboBox cb1
= new JComboBox();
private JTextArea tA=
new JTextArea(14,26);
private static
String[] items = {
"java.lang","java.io","java.util","java.nio",
"java.awt","java.applet","javax.swing",
"java.awt.event","javax.swing.event","java.lang.reflect",
"java.util.regex"
};
private static
String[] usaful = {
"String","StringBuffered","Arrays",
"FileInputStream","BufferedOutputStream",
"ActionEvent","File","List","JTextArea","JApplet"
};
public void
init(){
Container cp =
getContentPane();
JPanel jp = new
JPanel();
for(int i=0;
i
cb.addItem(items[i]);
for(int i=0;
i
cb1.addItem(usaful[i]);
cb.addActionListener(new
cbL());
cb1.addActionListener(new
cb1L());
method.addActionListener(new
methodL());
contrl.addActionListener(new
contrlL());
exit.addActionListener(new
exitL());
jp.setLayout(new
GridLayout(11,1));
jp.add(lb2 );
jp.add(tf2); jp.add(cb1);
jp.add(lb1 );
jp.add(tf1); jp.add(cb);
jp.add(lb3 );
jp.add(tf3);
JPanel jp1 = new
JPanel(new FlowLayout());
jp1.add(method);
jp1.add(contrl);
jp.add(jp1);
jp.add(exit);
JLabel lb = new
JLabel("顯示類的方法和構建器:");
lb.setFont(new
Font("MS serif", 0 ,20));
JPanel jp0 = new
JPanel(new BorderLayout());
jp0.add(lb,
"North");
jp0.add(new
JScrollPane(tA),"South");
cp.setLayout(new
FlowLayout());
cp.add(jp0);
cp.add(jp);
Font myFont = new
Font( "MS serif", 1 ,16) ;
tA.setFont( myFont)
;
tf1.setFont( myFont)
;
tf2.setFont( myFont)
;
tf3.setFont( myFont)
;
}
class cbL implements
ActionListener{
public void
actionPerformed(ActionEvent e){
tf1.setText((String)cb.getSelectedItem());
}
}
class cb1L implements
ActionListener{
public void
actionPerformed(ActionEvent e){
tf2.setText((String)cb1.getSelectedItem());
}
}
class methodL
implements ActionListener{
public void
actionPerformed(ActionEvent e){
String sName = tf1.getText() + "." + tf2.getText();
String key = tf3.getText();
getMethods(sName, key);
}
}
class contrlL
implements ActionListener{
public void
actionPerformed(ActionEvent e){
String sName = tf1.getText() + "." + tf2.getText();
getConstructors(sName);
}
}
class exitL implements
ActionListener{
public void
actionPerformed(ActionEvent e){
if(e.getSource().equals((Object)exit))
System.exit(0);
}
}
public static
void main(String[] args) {
ConstractorMethods
myFrame = new ConstractorMethods();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.init();
myFrame.setTitle("查詢某類的方法");
myFrame.setSize(500,
430);
myFrame.setLocation(200,200);
myFrame.setVisible(true);
}
public void
getMethods(String className,String keyWord){
Pattern qualifier =
Pattern.compile("\\w+\\.");
Class
klass;
try
{
klass =
Class.forName(className);
}
catch(ClassNotFoundException ex) {
tA.setText("No such class");
return;
}
Method[]
methods = klass.getMethods();
tA.setText("");
for(int i =
0; i < methods.length; i++) {
if(methods[i].toString().indexOf(keyWord)
!= -1){
Matcher matcher =
qualifier.matcher(methods[i].toString());
if(matcher.find())
tA.append(matcher.replaceAll("") + "\n");
}
}
}
public void
getConstructors(String className){
Pattern qualifier =
Pattern.compile("\\w+\\.");
Class
klass;
try
{
klass =
Class.forName(className);
}
catch(ClassNotFoundException ex) {
tA.setText("No such class");
return;
}
Constructor[]
ctor = klass.getConstructors();
tA.setText("");
for(int i =
0; i < ctor.length; i++) {
Matcher matcher =
qualifier.matcher(ctor[i].toString());
if(matcher.find())
tA.append(matcher.replaceAll("") + "\n");
}
}
}
__完__
總結
以上是生活随笔為你收集整理的java查询类提供的方法_查询一个类的方法和构建器的JAVA程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql清理 frm_通过.frm .
- 下一篇: node.js 执行php,node.j