class A {
static A STATIC_A = new A();
A() {}
}
boolean isComingFromStaticField(Object a) {
// returns true if a comes from static field, for example A.STATIC_A
// returns false if a comes from non-static field/variable, for example new A()
// .. or vice versa ...
}
在Java反射中,了解静态字段中的对象与“普通”字段/变量之间的区别的方法是什么?
答案 0 :(得分:4)
没有“静态实例”和“普通实例”这样的东西。只有静态变量(和方法等)。例如:
public class Foo {
static Object bar = new Object();
Object baz = bar;
}
这里baz
和bar
的值引用同一个对象 - 尽管一个变量是静态的,一个是实例变量。
现在,如果只是想要检查特定引用是否等于A.STATIC_INSTANCE
,那么这是一个简单的引用相等性检查:
boolean isStaticInstance(Object a) {
return a == A.STATIC_INSTANCE;
}
...但请注意,检查的所有是引用相等。在你自己的脑海中澄清你的真实含义后,你应该避免使用像“静态实例”这样的误导性术语。
答案 1 :(得分:4)
实例(在您的示例中为A类)只是一个实例,某些类B中的静态变量可能指向它,但C类中的另一个非静态变量也可能指向它。所以你不能进行这项检查,因为它没有意义。