获取属于某个类的所有对象

时间:2010-11-08 19:48:31

标签: java android reflection

我来自Ruby on Rails背景,并开始做一些Android编程。

我正在寻找一种使用Java获取类中所有对象列表的方法。

在Rails中,您可以执行类似Building.all的操作,它将返回所有已创建建筑物的数组

Java中有类似的东西吗?

如果是这样,您是否可以发布一个示例,它将为Building类返回一组构建对象?

3 个答案:

答案 0 :(得分:3)

没有。但是如果你想要这样的清单,你可以自己填写:

private static final Set<WeakReference<Building>> instances = 
       Setes.newSetFromMap(new IdentityHashMap<WeakReference<Building>>());

public Building() {
     synchronized(Building.class) {
         instances.add(new WeakReference(this));
     }
}

// etc the same in all constructors

Sets.newSetFromMap(..)来自番石榴图书馆。如果您不想使用它们,只需使用Mapput(this, Boolean.TRUE)

即可

WeakReference表示如果不在其他地方使用对象,则会对其进行垃圾回收。 IdentifyHashMap表示覆盖hashCode()equals()无关紧要,您的地图将填充不同的实例。 (感谢Luke Hutteman的这些改进)

这是否应该以这种方式实现是有争议的。我会说创建实例的人可以保留对它们的引用,而不是类本身。

答案 1 :(得分:2)

Building.all仅适用于Rails,因为类也是ActiveRecord对象关系查询的入口点。当你说Building.all时,它正在运行一个SQL查询来从Buildings表中提取所有构建对象。

因此,Java中真正的等价物是使用使用Active Record模式的ORM工具。有一些,例如this one,但没有一个真正抓住我能找到的。不知道它是否适用于Android。

Grails可以与Android一起使用吗?如果你想回到你的Rails舒适区,但在JVM世界里,这是你最好的选择。

答案 2 :(得分:1)

Luis,当你在Rails中调用Building.all时,实际上会发生很多事情:

  1. Rails查询数据库(数据库应该有'buildings'表)。
  2. 然后将来自DB请求的get“解析”为Building实例的集合。
  3. 因此,如果你想在Android上寻找相同的魔法,开箱即用,那么不幸的是,事实并非如此。相反,您应该实现自己的ORM和迁移方法。起点是SQLiteOpenHelper