2016-03-03 98 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下类,因为它们在默认情况下