1

我有一个看起来像这样的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 
4

3 回答 3

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则为真,但如果是在其他地方声明的子类,则为假。object1InnerClass1object1InnerClass1

于 2013-10-08T16:33:34.943 回答
0

当您创建一个对象并持有对它的引用时

Object obj = new Object();

你几乎可以在任何你想要的地方传递这个参考,即。将其分配给类字段,将其用作方法参数等。没有任何东西将其链接到特定的类字段。

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

于 2013-10-08T15:06:01.307 回答
0

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

于 2013-10-08T15:48:11.617 回答