2014-12-19 44 views
0

假设我有一个对象,我把它字段:确定一个字段是I型创建,使用反射

Field[] fields = obj.getFields(); 

现在我迭代通过每一个与愿印他们的成员,如果它是某种类,否则只要使用field.get(obj)以防万一它是一个字符串,int或任何该命令将打印其值的东西,而不仅仅是引用指针。

我该如何检测它?

+0

每'的System.out.println(OBJ) 'call会隐式地调用'System.out.println(obj.toString())'。所以int,字符串和覆盖'toString()'方法的任何其他类都不会打印引用指针。 – BackSlash 2014-12-19 08:44:43

+0

好的,但有没有办法告诉它的一个类是否在项目中声明,而不是内部的java? – buddy123 2014-12-19 08:46:37

+0

@ e-r-a-n您可以检查软件包名称。但是这并不能解决是否知道'toString()'是否被覆盖的问题。这是你的最终目标吗?如果是这样,请参阅[检测对象是否覆盖toString()](http://stackoverflow.com/q/22866925)。 – 2014-12-19 08:46:57

回答

0

您可以使用instanceof来区分对象。

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { 
    Object[] objects = new Object[4]; 
    objects[0] = new Integer(2); 
    objects[1] = "StringTest"; 
    objects[2] = new BigDecimal(2.00d); 
    for (Object obj : objects) { 
     if (obj != null) { 
      if (obj instanceof BigDecimal) { 
       System.out.println("bigdecimal found " + obj); 
      } else if (obj instanceof String) { 
       System.out.println("String found " + obj); 
      } else { 
       System.out.println("Integer found " + obj); 
      } 
     } 
     else{ 
      System.out.println("object is null"); 
     } 
    } 
} 
0

如果你需要测试对象是否在你的项目,你可以看看包名,并将其与你的项目的包名。

您可以在声明的字段类型或字段内容的运行时类型上执行此操作。下面的代码片段演示了后一种方法:

SomeClass foo = new SomeClass(); 

for (Field f : foo.getClass().getDeclaredFields()) { 

    boolean wasAccessible = f.isAccessible(); 
    try { 
    f.setAccessible(true); 
    Object object = f.get(foo); 

    if (object != null) { 

     if (object.getClass().getPackage().getName() 
      .startsWith("your.project.package")) { 
     // one of yours 
     } 
    } else { 
     // handle a null value 
    } 
    } finally { 
    f.setAccessible(wasAccessible); 
    } 
} 

一定要记得obj.getFields();只返回公共访问的领域。正如我上面所做的那样,您可能需要考虑getDeclaredFields()。如果您坚持使用getFields(),则可以省略上例中的辅助功能代码。

1

你可以得到,而不需要一类的各领域的Type这样的实例:

public class GetFieldType { 

    public static void main (String [] args) { 
     Field [] fields = Hello.class.getFields(); 

     for (Field field: fields) { 
      System.out.println(field.getGenericType()); 
     } 
    } 

    public static class Hello { 
     public ByeBye bye; 
     public String message; 
     public Integer b; 
     ... 
    } 
} 
0

有了一些工作,你可以通过加载它们的类加载器区分你的类。在此请看:

Find where java class is loaded from

虽然这可能帮助,它不会成为你的问题的灵丹妙药,这主要是因为:

  • 元(字节,短,焦炭,INT ,long,float,double和boolean)不是类。
  • 类加载器的体系结构在不同的应用程序服务器中是不同的。
  • 同一个类可以被不同的类加载器多次加载。
0

我的理解是你怎么去在对象层次递归,并得到原语的值

public class ParentMostClass { 
    int a = 5; 
    OtherClass other = new OtherClass(); 

    public static void main(String[] args) throws IllegalArgumentException, 
    IllegalAccessException { 
     ParentMostClass ref = new ParentMostClass(); 
     printFiledValues(ref); 
    } 

public static void printFiledValues(Object obj) 
    throws IllegalArgumentException, IllegalAccessException { 

    Class<? extends Object> calzz = obj.getClass(); 
    Field[] fileds = obj.getClass().getDeclaredFields(); 

    for (Field field : fileds) { 
     Object member = field.get(obj); 
     // you need to handle all primitive, they are few 
     if (member instanceof String || member instanceof Number) { 
      System.out.println(calzz + "->" + field.getName() + " : " 
      + member); 
     } else { 
      printFiledValues(member); 
    } 
    } 
} 
} 

public class OtherClass { 
    int b=10; 
} 

我输出

class com.example.ParentMostClass->a : 5 
class com.example.OtherClass->b : 10 
相关问题