2016-03-03 124 views
1

檢測的Java類的名字讓我們假設你有下面的Java代碼:從純文本

public class Test { 
    public Test() { 
     string name = "Robot"; 
     Robot aRobot = new Robot(); 
     List<String> aList = new List<String>(); 
    } 
} 

你會如何在檢測TeststringListRobot是類的名稱和位置文本文件?

+0

您可能要檢查列入變得棘手'JBoss的Roaster'及其JDT實現,它允許您解析Java源代碼。 – rkosegi

回答

1
You can use Refelction API for finding the type of the field in your java file. 

import java.lang.reflect.Field; 
import java.util.List; 

public class FieldSpy<T> { 
    public boolean[][] b = {{ false, false }, { true, true } }; 
    public String name = "Alice"; 
    public List<Integer> list; 
    public T val; 

    public static void main(String... args) { 
    try { 
     Class<?> c = Class.forName(args[0]); 
     Field f = c.getField(args[1]); 
     System.out.format("Type: %s%n", f.getType()); 
     System.out.format("GenericType: %s%n", f.getGenericType()); 

     // production code should handle these exceptions more gracefully 
    } catch (ClassNotFoundException x) { 
     x.printStackTrace(); 
    } catch (NoSuchFieldException x) { 
     x.printStackTrace(); 
    } 
    } 
} 
Sample output to retrieve the type of the three public fields in this class (b, name, and the parameterized type list), follows. User input is in italics. 

$ java FieldSpy FieldSpy b 
Type: class [[Z 
GenericType: class [[Z 
$ java FieldSpy FieldSpy name 
Type: class java.lang.String 
GenericType: class java.lang.String 
$ java FieldSpy FieldSpy list 
Type: interface java.util.List 
GenericType: java.util.List<java.lang.Integer> 
$ java FieldSpy FieldSpy val 
Type: class java.lang.Object 
GenericType: T 
+0

這可以工作,但不幸的是我正在處理純文本,所以反射超出了圖片:/ – Rawr

0

一個相當哈克的解決辦法是放在一個文件中的文本除去進口之後,並與來自公共類不同

然後使用JavaCompiler包編譯的飛行文件的名稱並趕上compilation errors

  1. 你能趕上「沒有定義類」類型,默認的Java類的錯誤。
  2. 對於由您定義,如果它是一個公共類,你會得到一個錯誤,如「類必須在它自己的文件中定義」類

所以最終你會得到

  1. 類的編譯錯誤
  2. 錯誤陳述

這可能是從長遠來看,過於複雜的類的名稱,卜行號t在沒有圖書館的情況下做OP的內容,這可以使用。

此外,事情可能爲java.lang下類,因爲它們在默認情況下