{"id":382,"date":"2009-08-01T11:52:00","date_gmt":"2009-08-01T11:52:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=382"},"modified":"2009-08-01T11:52:00","modified_gmt":"2009-08-01T11:52:00","slug":"frage-kann-man-alle-instanzen-einer-klasse-ermitteln","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2009\/08\/frage-kann-man-alle-instanzen-einer-klasse-ermitteln\/","title":{"rendered":"Frage: Kann man alle Instanzen einer Klasse ermitteln?"},"content":{"rendered":"<p>Das geht nicht wirklich und wenn, dann nur mit gro\u00dfen Umwegen etwa \u00fcber die Java Debugging API, mit der man sich an die JVM h\u00e4ngen kann. Auch ein Blick auf den Quellcode von jconsole und jmap\/jhat helfen hier, weil die Tools genau das machen und Zahlen geben. <\/p>\n<p>Der Objektgraf ver\u00e4ndert sich st\u00e4ndig und so k\u00f6nnte man auch die Objekte stark referenzieren und den GC am L\u00f6schen hindern. Das w\u00fcrde zu einer gro\u00dfen Anzahl von Problemen f\u00fchren. (Schwache Referenzen k\u00f6nnte das Problem abmildern, aber der GC muss hier Zusatzarbeit machen und die Laufzeit w\u00fcrde sich (messbar) verschlechtern.) Die Objekte sind ja immer eine Momentaufnahme. Da k\u00e4men ja Millionen von Objekten raus, wenn man etwa nach &#8222;Gib mir alle Strings&#8220; fragt. Laufend \u00e4ndert sich diese Menge.  <\/p>\n<p>Wenn der Nutzer diese Instanzen wirklich braucht, kann er sie an einer Objekt-Registry anmelden. <\/p>\n<ul>\n<li>Von Hand kann man Exemplare etwa in eine Map&lt;Class,List&lt;?&gt;&gt; setzen. Das muss man nicht unbedingt manuell machen, sondern man kann hier einen Aspekt schreiben, der Bytecode in den Konstruktor f\u00fcr solch ein Anmelden einf\u00fcgt. Dann ist das Abmelden aber noch so eine Sache. Das kann aber eine <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/java\/lang\/ref\/PhantomReference.html\">PhantomReference<\/a> \u00fcbernehmen und so meldet man das Objekt an der Registry wieder ab.<\/li>\n<li>Wenn man Spring benutzt, deklariert <a href=\"http:\/\/static.springsource.org\/spring\/docs\/2.0.x\/api\/org\/springframework\/beans\/factory\/ListableBeanFactory.html\">ListableBeanFactory<\/a> (implementiert etwa von <a href=\"http:\/\/static.springsource.org\/spring\/docs\/2.0.x\/api\/org\/springframework\/beans\/factory\/xml\/XmlBeanFactory.html\">XmlBeanFactory<\/a>) eine Methode Map getBeansOfType(Class type) f\u00fcr genau diesen Fall.<\/li>\n<li>Sind die Exemplare alle MBeans, ist es einfach, dann sind sie schon an einem Container registriert, und <a href=\"http:\/\/java.sun.com\/javase\/6\/docs\/api\/javax\/management\/Query.html\">Query<\/a> liefert sie sogar nach gewissen Kriterien.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Das geht nicht wirklich und wenn, dann nur mit gro\u00dfen Umwegen etwa \u00fcber die Java Debugging API, mit der man sich an die JVM h\u00e4ngen kann. Auch ein Blick auf den Quellcode von jconsole und jmap\/jhat helfen hier, weil die Tools genau das machen und Zahlen geben. Der Objektgraf ver\u00e4ndert sich st\u00e4ndig und so k\u00f6nnte [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[14],"tags":[],"class_list":["post-382","post","type-post","status-publish","format-standard","hentry","category-java-se"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=382"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/382\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}