Java 从反射中获取字段的类名

Java 从反射中获取字段的类名,java,reflection,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);

我在这件事上兜圈子

我有一个班上的人

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);
      }
试试看{
String className=this.getClass().getName();
Class cls=Class.forName(className);
字段字段列表[]=cls.getDeclaredFields();
对于(int i=0;i
我设法找到了一个说明:

类java.lang.String

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

有什么想法吗?

试试。。getType()然后是getName()

编辑:(绿色日评论之后)——请注意
fld.getType().getCanonicalName()
在大多数情况下会给出相同的输出。使用内部类时,输出是不同的。这是来自搜索的信息。根据需要对classname执行的操作,可以选择getName()或getCanonicalName()中的一个

结果:

3. java.lang.String
我想我解决了

本应这样做:

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

我通过调用这个函数得到了一个字段的类名
f、 getDeclaringClass().getSimpleName()

它是在类的toString方法中给出的,它是这样写的,“Class Your Class name”谢谢大家,但是.getName()在我工作的情况下更可靠。这实际上是不正确的,因为
f.getDeclaringClass()
返回已声明字段的类的类型,而不是字段类型本身
f.getType()
是正确答案。
3. java.lang.String
String stype = fld.getType().getName();