我有一个看起来像这样的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
答案 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并查看是否列出了相关字段。当然,你首先需要获得字段名称,而且你不知道如何做到这一点。