从反射中获取字段的类名

时间:2012-01-19 04:51:15

标签: java reflection

我绕圈子走了一圈。

我有一个人类,例如

public class Person {
String name = "";
}

现在,我想反省这个类实例&弄清楚什么类名称声明为。

因此,name = String或java.lang.String

这是我的代码:

'this'是Person的一个实例。

try {
    String className = this.getClass().getName();
        Class cls = Class.forName(className);
        Field fieldlist[] = cls.getDeclaredFields();
        for (int i = 0; i < fieldlist.length; i++) {
           Field fld = fieldlist[i];
           int mod = fld.getModifiers();
           System.out.println("1. " + fld.toGenericString());
           System.out.println("2. " + fld.getName());
           System.out.println("3. " + fld.getGenericType() + "]");



           Object oj = fld.getType();

           // Says that 4: class java.lang.String

           System.out.println("4: " + oj.toString());
           Class c1 = oj.getClass();

           // Should throw Exception
           String stype = c1.getDeclaringClass().toString();
           System.out.println("5. " + stype);


        }
      }
      catch (Throwable e) {
         System.err.println(e);
      }

我设法找到了一个声明:

的部分

class java.lang.String

但我需要它是“java.lang.String”

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

尝试.. getType()然后getName()

 fld.getType().getName()

编辑:( Aften Green Days'评论) - 请注意 在大多数情况下,fld.getType().getCanonicalName()会提供相同的输出。使用内部类时输出不同。以下link来自搜索。根据您对classname的需要,您可以选择getName()或getCanonicalName()

之一

答案 1 :(得分:2)

System.out.println("3. " + fld.getType().getCanonicalName()); 

结果:

3. java.lang.String

答案 2 :(得分:0)

我想我解决了,

应该这样做:

String stype = fld.getType().getName();

答案 3 :(得分:-1)

我通过调用它获得了字段的类名 f.getDeclaringClass()。getSimpleName()