首先要獲取需要進行分析的類的名稱
將類名稱指定到Class類中的forName(String classname)方法為參數
調用該方法後將返回一個該指定類型的Class對象
Class對象描述了該類型的詳細信息
其中一些重要的方法包括
getFields()
getMethods()
getConstructors()這些方法分別返回該類型中支持的公有字段
方法和構造器數組
其中包含超類的公有成員
而同是Class中以上的方法名稱中加入了
Declared
的方法則返回該類型中定義的所有成員包括私有的但不包括超類成員
現在
我們已經獲得了該類型的字段
方法和構造器數組
接著
我們使用java
lang
reflect包中的Field
Method
Constructor類來獲得字段
方法和構造器的詳細信息
例如
我們要顯示該類型中的所有的字段信息
偽代碼
//getDeclaredFields返回所有定義的字段數組
Field[] fields = Class
getDeclaredFields();
for (i =
; i < fields
length; i++)
{
Field f = fields[i];
Class type = f
getType(); //getType()返回字段的數據類型
String name = f
getName(); //getName()返回字段名稱
println(Modifier
toString(f
getModifiers()));
//getModifiers()返回一個代表訪問控制符的整數
//Modifier
toString()將該整數轉換為對應的訪問控制符字符串
println(
+ type
getName() +
+ name);
//type
getName()返回數據類型名稱
}
好了下面看一個完整的例子
例子長了一點不過很簡單!
import java
lang
reflect
*;
import javax
swing
*;
public class ReflectTest
{
public static void main(String[] args)
{
String name;
if (args
length >
)
name = args[
];
else
name = JOptionPane
showInputDialog(
輸入一個類名:按(java
lang
Double)格式
);
try
{
Class cl = Class
forName(name);
Class supercl = cl
getSuperclass(); //獲得超類的Class對象
System
out
println(
class
+ name);
//判斷超類是否為空或為Object
if (supercl != null && supercl != Object
class)
System
out
println(
extends
+ supercl
getName());
System
out
print(
\n{\n
);
printConstructors(cl);
System
out
println();
printMethods(cl);
System
out
println();
printField(cl);
System
out
println(
}
);
}
//當使用class對象時注意捕獲該異常
異常為類型未創建
catch(ClassNotFoundException e)
{
e
printStackTrace();
System
out
println(
類型未創建
);
}
System
exit(
);
}
/**
*該方法打印構造器的詳細信息
*/
public static void printConstructors(Class cl)
{
//定義構造器數組
Constructor[] constructors = cl
getDeclaredConstructors();
for (int i =
; i < constructors
length; i++)
{
//將數組元素賦給一個構造器對象
Constructor constr = constructors[i];
String name = constr
getName(); //獲取構造器名稱
//打印訪問修飾符
System
out
print(Modifier
toString(constr
getModifiers()));
System
out
print(
+ name +
(
);
/**
*定義一個參數類型數組該數組是Class對象
*getParameterTypes()返回該構造器參數類型的數組
*打印參數類型名稱
*/
Class[] paramTypes = constr
getParameterTypes();
for (int j =
; j < paramTypes
length; j++)
{
if (j >
) System
out
print(
);
System
out
print(paramTypes[j]
getName());
}
System
out
println(
);
);
}
}
/**
*該方法打印方法的詳細信息
*/
public static void printMethods(Class cl)
{
Method[] methods = cl
getDeclaredMethods();
for (int i =
; i < methods
length; i++)
{
Method m = methods[i];
Class retType = m
getReturnType();
String name = m
getName();
System
out
print(Modifier
toString(m
getModifiers()));
System
out
print(
+ retType
getName() +
+ name +
(
);
Class[] paramTypes = m
getParameterTypes();
for (int j =
; j < paramTypes
length; j++)
{
if (j >
) System
out
print(
);
System
out
print(paramTypes[j]
getName());
}
System
out
println(
);
);
}
}
/**
*該方法打印字段的詳細信息
*/
public static void printField(Class cl)
{
Field[] fields = cl
getDeclaredFields();
for (int i =
; i < fields
length; i++)
{
Field f =fields[i];
Class type = f
getType();
String name = f
getName();
System
out
print(Modifier
toString(f
getModifiers()));
System
out
println(
+ type
getName() +
+ name +
;
);
}
}
}
我經常遇到這樣的問題
比如當我要寫一個接受命令行參數的程序時我通常是先打開NetBeans工具
寫完並保存後有回到命令提示符上使用javac編譯java運行
為什麼?因為用開發環境運行的話接收不了命令行參數而會拋出一個異常
我是不是很蠢
其實用一個JOptionPane
showInputDialog可以避免發生這樣的事情
只需加一個判斷
我們編程的良好風格是多關心如何編寫穩重的代碼
而不是動不動就捕捉異常!
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19672.html