按给定的字段对象查找类实例

时间:2013-02-17 13:30:24

标签: java

是否可以使用公共静态方法找到对象实例,该方法需要将字段对象作为参数?

这就是我搜索的内容:

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

5 个答案:

答案 0 :(得分:2)

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

任何Bar个实例都可以引用给定的Foo对象,或者实际上没有。除非您明确有从BarFoo的引用,否则无法找到它们。

(当然,如果你知道系统中的所有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对象的搜索元数据。或者你可以在这个方法中简单地创建新实例:)