Alle Instanzen einer Klasse

lernen.2007

Erfahrenes Mitglied
Hallo Leute,
ich habe eine Klasse z.B.
class HelloWorld
Viele andere Klassen oder Methoden erzeugen mit new die Klasse HelloWorld. Jetzt will ich alle Instanzen von HelloWorld haben, die natürlich mit new angelegt worden sind. Gibt es irgendwie eine Möglichkeit rauszukriegen, wo die Klassen erzeugt worden sind, und das ich auch an die Instanz drankomme?
Danke
 
Hallo!

Das geht nur ueber externe APIs wie das JVM TI ODER du implementierst eine Art Registry in der du deine Instanzen nach Erzeugung registrierst und diese, wenn sie nicht mehr gebraucht werden, deregistrierst. Hierbei gilt es natuerlich darauf zu achten, dass man nicht unnoetig "starke" Referenzen auf Elemente haelt, da sonst der Garbage Collector diese nicht wegraeumen kann. Hier bieten sich dann beispielsweise Weak- und SoftReferences an...

Gruss Tom
 
Moin,
korrigiere mich, wenn ich Dich falsch verstanden habe, aber ich dachte zunächst an eine static Lösung:
Code:
import java.util.ArrayList;
import java.util.List;

public class HelloWorld {
	/**
	 * Die Liste der erzeugten Instanzen dieser Klasse
	 */
	static List<Object> instances;
	
	public static List<Object> getAllInstances()
	{
		if ( instances == null )
			instances = new ArrayList<Object>();
		return instances;
	}
	
	/**
	 * Konstruktor - bei jedem Aufruf wird der Aufrufende
	 * in der Liste gespeichert
	 * 
	 * @param callingReference
	 */
	HelloWorld(Object callingReference)
	{
		getAllInstances().add( callingReference );
	}
	
	public static void main(String[] args)
	{
		HelloWorld hello1 = new HelloWorld( HelloWorld.class );
		HelloHarald hello2 = new HelloHarald();
		
		int iNumberOfInstances = HelloWorld.getAllInstances().size();
		for (int i = 0; i < iNumberOfInstances; i++) {
			System.out.println("Hashcode: " + HelloWorld.getAllInstances().get( i ).hashCode());
			System.out.println("Klasse: " + HelloWorld.getAllInstances().get( i ).toString());
		}
	}
}

Code:
public class HelloHarald {
	public HelloHarald() {
		HelloWorld helloWorld = new HelloWorld( this );
	}
}

Ausgabe z.B.

Hashcode: 26022015
Klasse: class HelloWorld
Hashcode: 3541984
Klasse: HelloHarald@360be0
 
Zuletzt bearbeitet:
Hallo!
Die static Loesung ... ist wie ich schon sagte eine Form der Registry... die bei unsachgemaesser Anwendung eben die Instanzen im Speicher haelt ...
Code:
/**
 * 
 */
package de.tutorials;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author daritho
 * 
 */
public class InstanceRegistry {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Foo foo = new Foo();
		foo();
		bar();
		foo();
		bar();
		foo();
		bar();
		foo();
		bar();
		foo();
		bar();
		foo();
		bar();
		// foo = null;
		System.gc();
		System.out.println(Foo.instances.size());
		for (WeakReference<Foo> fooReference : Foo.instances) {
			Foo f = fooReference.get();
			System.out.println(f);
		}
		System.out.println(Foo.instances.size());
	}

	private static void bar() {
		Foo foo = new Foo();
	}

	private static void foo() {
		Foo foo = new Foo();
	}

	static class Foo {
		final static List<WeakReference<Foo>> instances = Collections
				.synchronizedList(new ArrayList<WeakReference<Foo>>());

		private WeakReference ref;

		public Foo() {
			ref = new WeakReference<Foo>(this);
			instances.add(ref);
		}

		public void dispose() { //method for manually clean-up
			instances.remove(ref);
			ref = null;
		}
		
		protected void finalize() throws Throwable {
			if (ref != null) { // the developer forgot to release the resource, so we will clean up
				instances.remove(ref);
				ref = null;
			}
		}
	}
}

Gruss Tom
 
Zurück