确定某个类是否是另一个类的字段

时间:2013-10-08 14:57:27

标签: java class object

我有一个看起来像这样的java类:

public class MainClass {

  public static class InnerClass1 extends SomeClass {
    ...
  }

  public static class InnerClass2 extends SomeClass {
    ...
  }
}

在运行时,有没有办法检查一个对象是InnerClass1的一个实例并且知道它是MainClass上的一个字段?我知道我可以向MainClass添加一个静态数组,其中包含SomeClass字段的列表,但我喜欢在程序上更具动态性的东西。像这样:

MainClass.InnerClass1 object1 = someKindOfFactory.getObject();
BigDecimal someNumber = new BigDecimal("45.77");

if (object1.comesFrom(MainClass.class)) {
  LOG.debug("Object is from MainClass");
} else {
  LOG.debug("Object comes from somewhere else");
}

if (someNumber.comesFrom(MainClass.class)) {
  LOG.debug("Object is from MainClass");
} else {
  LOG.debug("Object comes from somewhere else");
}

结果:

DEBUG: Object is from MainClass
DEBUG: Object comes from somewhere else 

3 个答案:

答案 0 :(得分:2)

很难准确说出你想要实现的目标,但Class.getEnclosingClass()可能会对你有所帮助:

MainClass.InnerClass1 object1 = someKindOfFactory.getObject();
BigDecimal someNumber = new BigDecimal("45.77");

if (object1.getClass().getEnclosingClass() == MainClass.class) {
  LOG.debug("Object is from MainClass");
} else {
  LOG.debug("Object comes from somewhere else");
}

if (someNumber.getClass().getEnclosingClass() == MainClass.class) {
  LOG.debug("Object is from MainClass");
} else {
  LOG.debug("Object comes from somewhere else");
}

在这种情况下object1.getClass().getEnclosingClass() == MainClass.class如果object1直接是InnerClass1的实例,则为object1,如果InnerClass1是{{1}}的子类,则{em> false {1}}在其他地方宣布。

答案 1 :(得分:0)

创建对象并保留对它的引用时

Object obj = new Object();

你可以在任何你想要的地方传递这个参考,即。将它分配给类字段,将其用作方法参数等。没有任何东西将它与特定的类字段相关联。

类似地,内部类具有对其外部类的引用。但是,您可以创建任意数量的内部类对象。外类无法知道它们有多少或者它们是什么(想象垃圾收集的噩梦)。

答案 2 :(得分:0)

如果您的意思是在运行时确定是否在子类或超类中定义了给定字段,则必须在子类的Class对象上使用getDeclaredFields并查看是否列出了相关字段。当然,你首先需要获得字段名称,而且你不知道如何做到这一点。