是否可以使用公共静态方法找到对象实例,该方法需要将字段对象作为参数?
这就是我搜索的内容:
public class Foo {
private Bar myObject;
public static Foo get(Bar bar) {
// return an instance of Foo which has stored a
// reference to bar inside myObject or null if not found
}
}
我希望,你了解我的担忧。谷歌没有帮助,我只是猜测可能有一个使用Java Reflection的解决方案。非常感谢您的帮助。
答案 0 :(得分:2)
不,没有办法知道这一点。
任何Bar
个实例都可以引用给定的Foo
对象,或者实际上没有。除非您明确有从Bar
到Foo
的引用,否则无法找到它们。
(当然,如果你知道系统中的所有Foo
个实例,你可以这样搜索......)
答案 1 :(得分:0)
不,你不能以这种方式回溯一个领域。 bar
方法接收的get
引用是传入的引用的副本。可能有数十个对同一Bar
个对象的引用,或者没有。如果您有系统中所有Foo
个对象的列表,您可以找出(通过反射,因为myObject
是私有的)Foo
个对象具有相同的引用,但它可能很容易就是有多个,或者没有,因为没有办法知道你收到的bar
被任何Foo
实例引用,也没有任何理由它只能被引用其中之一。
答案 2 :(得分:0)
不容易,我的直觉反应是除非有一个非常特殊的情况,你可能会以错误的方式解决问题。
如果确实需要这样做,可以使用instrumentation注册您感兴趣的类的构造函数,这些类可能引用Foo,然后在某处保留对创建的对象的引用。 / p>
然后,您可以在需要时逐步浏览所有这些引用,并使用反射来检查是否包含您所追求的字段类型。
它不漂亮,效率不高,在大多数情况下都是完全不切实际的,但纯粹从技术角度回答问题,这是我能想到的唯一方法。
答案 3 :(得分:0)
不确定这是否与反射有关,您只需要跟踪您Foo
,因此您需要保留所有创建的Foo的静态地图。
public class Foo {
private static final Map<Bar, Foo> BAR_FOO_MAP = new HashMap<>();
private final Bar bar;
private Foo(final Bar bar) {
this.bar = bar;
}
public static Foo newInstance(final Bar bar) {
final Foo foo = new Foo(bar);
BAR_FOO_MAP.put(bar, foo);
return foo;
}
public static Foo findFoo(final Bar bar) {
return BAR_FOO_MAP.get(bar);
}
}
正如其他人所指出的,除非你有unqiue映射,否则这不起作用 - 你可能不得不使用Map<Bar, Collection<Foo>>
甚至guava Multimap
。
答案 4 :(得分:0)
不,我不这么认为,但是如果你有一个已知对象的列表(例如使用静态列表并添加每个新的比例),你可以创建一个比较bar到fiel对象的搜索元数据。或者你可以在这个方法中简单地创建新实例:)