在java中與c#中都提供了反射機制,利用這種反射機制可以做很多有用的事情,比如實現AOP等功能,最近看了一篇關於實現AOP的內部機理的Blog,所以,開始看了一些反射的文章,這裡我把我寫的一些代碼拿出來,供大家分享,不久還會提供C#的利用反射機製得到類的資訊的代碼。
程式啟動並執行命令如下:(我把我的JAVA程式放到了c:/java下面了)
運行介面的部分如下:
詳細的代碼如下:
import java.lang.reflect.*;
import java.util.regex.*;
public class ClassInfo
{
static void printinfor(Class cc)
{
System.out.println("類名->"+cc.getName());
}
private static Pattern p=Pattern.compile("/w+/.");
public static void main(String args[])
{
System.out.println("************************************************");
System.out.println("******************類的詳細資料提取**************");
System.out.println(" 使用方法:java ClassInfo 類名(類的全名)");
System.out.println(" 例如:java ClassInfo String");
System.out.println(" 目前支援類的簡寫的支援");
System.out.println("************************************************");
if(args.length<1)
{
System.out.println("用法錯誤");
System.out.println("Example:java ClassInfo String");
System.exit(0);
}
Class c=null;
try
{
c=Class.forName("java.lang."+args[0]);
Method[] m=c.getMethods();
Constructor[] ctor=c.getConstructors();
if(args.length==1)
{
printinfor(c);
Class []interarray=c.getInterfaces();
for(int i=0;i<interarray.length;i++)
System.out.println(c.getName()+"第"+(i+1)+"個"+"介面 "+interarray[i].getName());
Class cy=c;
int temp=1;
do
{
cy=cy.getSuperclass();
System.out.print("第"+temp+"級父類 ");
printinfor(cy);
temp++;
}
while(cy.getName()!="java.lang.Object");
for(int i=0;i<m.length;i++)
System.out.println("第"+(i+1)+"個方法"+p.matcher(m[i].toString()).replaceAll(""));
for(int i=0;i<ctor.length;i++)
System.out.println("第"+(i+1)+"建構函式"+p.matcher(ctor[i].toString()).replaceAll(""));
}
else
{
System.out.println("該方法只能帶一個參數");
}
}
catch(ClassNotFoundException e)
{
System.out.println("沒有找到給定類的資訊");
System.exit(0);
}
}
}
注意其中的
c=Class.forName("java.lang."+args[0]);
Method[] m=c.getMethods();
Constructor[] ctor=c.getConstructors();
這個是反射代碼的核心。
理解反射代碼的核心在於,在java程式啟動並執行時候,關於類的中繼資料都存放在一個特殊的類裡面,這個類在java裡被稱為“Class”,注意,這裡的Class的C是大寫,與平時的class可是不一樣的。