2013-02-17 66 views
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 
    } 
} 

我希望你明白我的关心。 Google没有帮助,我只是猜测可能有一个使用Java Reflection的解决方案。非常感谢您的帮助。

回答

0

不,你不能以这种方式回溯田地。 get方法接收的bar参考是拷贝所传递的参考文献。可能有数十个对同一个Bar对象的引用,或者没有引用。如果系统中有所有Foo对象的列表,则可以找出(通过反思,因为myObject是私有的),其中Foo对象具有相同的引用,但可能很容易发现有多个对象,或者没有,因为无法知道您收到的bar是否被任何Foo实例引用,也没有任何理由只能由其中一个引用。

2

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

给定Bar对象可以由Foo的任何数量的实例引用,或者实际上没有引用。除非你明确地有一个从BarFoo的参考,否则没有办法找到它们。

(当然,如果你知道系统中所有的Foo情况下,您可以搜索这种方式...)

0

不容易,我的直觉反应是,除非有一个非常特殊的情况下,你”可能会以错误的方式接近问题。

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

然后,您可以随时浏览所有这些引用,并使用反射检查是否有任何包含您之后的字段类型。

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

0

不确定这是否与反射,你只需要跟踪你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

0

不,我不这么认为,但是如果你有一个已知对象的列表(例如使用静态列表并添加每一个新的距离),你可以创建一个搜索方法来比较bar与场景对象..或者你可以简单地在这个方法中创建新的实例:)

相关问题