熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

在Java中使用反射分析類結構

2013-11-15 11:48:56  來源: JSP教程 

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

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.