通过给定的字段对象查找类实例
是否有可能使用公共静态方法来查找对象实例,该方法需要一个字段对象作为参数?通过给定的字段对象查找类实例
那是什么我搜索:
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
}
}
我希望你明白我的关心。 Google没有帮助,我只是猜测可能有一个使用Java Reflection的解决方案。非常感谢您的帮助。
不,你不能以这种方式回溯田地。 get
方法接收的bar
参考是拷贝所传递的参考文献。可能有数十个对同一个Bar
对象的引用,或者没有引用。如果系统中有所有Foo
对象的列表,则可以找出(通过反思,因为myObject
是私有的),其中Foo
对象具有相同的引用,但可能很容易发现有多个对象,或者没有,因为无法知道您收到的bar
是否被任何Foo
实例引用,也没有任何理由只能由其中一个引用。
不,没有办法知道这一点。
给定Bar
对象可以由Foo
的任何数量的实例引用,或者实际上没有引用。除非你明确地有一个从Bar
到Foo
的参考,否则没有办法找到它们。
(当然,如果你知道系统中所有的Foo
情况下,您可以搜索这种方式...)
不容易,我的直觉反应是,除非有一个非常特殊的情况下,你”可能会以错误的方式接近问题。
如果您真的需要这样做,您可以使用instrumentation来注册您感兴趣的类的构造函数,它可能引用Foo,然后在某处保留对创建对象的引用。
然后,您可以随时浏览所有这些引用,并使用反射检查是否有任何包含您之后的字段类型。
这并不美观,效率不高,在大多数情况下完全不切实际,但纯粹从技术角度回答这个问题是我能想到的唯一方法。
不确定这是否与反射,你只需要跟踪你Foo
s,所以你需要保持创建的所有Foos的静态地图。
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>>
甚至guavaMultimap
。
不,我不这么认为,但是如果你有一个已知对象的列表(例如使用静态列表并添加每一个新的距离),你可以创建一个搜索方法来比较bar与场景对象..或者你可以简单地在这个方法中创建新的实例:)