1

是否可以使用期望字段对象作为参数的公共静态方法找到对象实例?

这就是我搜索的内容:

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 反射的解决方案。非常感谢您的帮助。

4

5 回答 5

2

不,没有办法知道这一点。

一个给定的Bar对象可以被任意数量的实例引用Foo,或者实际上没有。除非您明确地引用了Barto Foo,否则无法找到它们。

(当然,如果你知道Foo系统中的所有实例,你可以这样搜索......)

于 2013-02-17T13:32:21.867 回答
0

不,我不认为,但是如果您有一个已知对象的列表(例如,使用静态列表并添加每个新实例),您可以创建一个搜索方法,将 bar 与 fiel 对象进行比较.. 或者您可以简单地创建此方法中的新实例:)

于 2013-02-17T13:39:34.023 回答
0

不,你不能那样回溯一个领域。方法接收的引用是传入引用的副本bar可能有几十个对同一对象的引用,或者没有。如果您有系统中所有对象的列表,您可以(通过反射,因为是私有的)找出哪些对象具有相同的引用,但很可能存在不止一个,或者没有,因为有无法知道您收到的内容是否被任何实例引用,也没有任何理由只能被其中一个引用。getBarFoomyObjectFoobarFoo

于 2013-02-17T13:32:11.767 回答
0

不容易,而且我的直觉反应是,除非有非常特殊的情况,否则您可能以错误的方式处理问题。

如果您确实需要这样做,您可以使用检测来注册您感兴趣的可能引用 Foo 的类的构造函数,然后在某处保留对已创建对象的引用。

然后,您可以根据需要逐步浏览所有这些引用,并使用反射检查是否有任何包含您所追求的字段类型。

它不漂亮,不高效,在大多数情况下完全不切实际,但纯粹从技术角度回答问题是我能想到的唯一方法。

于 2013-02-17T13:35:15.710 回答
0

不确定这与反射有关,您只需要跟踪您Foo,因此您需要保留所有创建的 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 映射,否则这将不起作用 - 您可能必须使用 aMap<Bar, Collection<Foo>>甚至是guava Multimap

于 2013-02-17T13:37:16.000 回答