Implementierte Interfaces ermitteln

Status
Nicht offen für weitere Antworten.

fragro

Mitglied
Hallo!

Ich hab folgendes Problem... ich habe eine abstrakte Basisklasse sagen wir AbstractBase, welche ein Remote Interface nennen wir es BaseRemote implementiert.

Code:
public abstract class AbstractBase extends UnicastRemoteObject implements BaseRemote {
...
}

von dieser Basisklasse erben weitere spezialisierte abstrakte Klassen welche Basisfunktionalitäten enthalten und ihrerseits ggf. ein erweitertes Remote...

Code:
public interface SpecializedRemote extends BaseRemote {
...
}

public abstract class AbstractSpecialized extends AbstractBase implements SpecializedRemote {
...
}

... im Konstruktor der abstrakten Basisklasse will ich mir alle implementierten Interfaces geben lassen die in den abgleiteten Klassen implementiert wurden...

Code:
public abstract class AbstractBase extends UnicastRemoteObject implements BaseRemote {
   public AbstractBase() throws RemoteException
   {
      super();
      Class<?>[] interfaces = this.getClass().getInterfaces();
   }
}

public abstract class AbstractSpecialized extends AbstractBase implements SpecializedRemote {
   public AbstractSpecialized throws RemoteException
   {
      super();
   }
}

Leider ist die länge des arrays = 0... weiß jemand von euch warum? Ich hätte mind. 3 Interfaces erwartert![/code]
 
wozu an Subklassen denken, sollte ja schon mit BaseRemote klappen,
funktioniert folgendes bei dir?

Code:
class Test
    extends UnicastRemoteObject
    implements BaseRemote
{

    public Test()
        throws RemoteException
    {
        String info = "ich bin: " + this.getClass().getName();
        info += ", interfaces: " + Arrays.toString(this.getClass().getInterfaces());
        System.out.println(info);
    }

    public static void main(String args[])
        throws Exception
    {
        new Test();
    }
}

interface BaseRemote
{
}

wann genau bekommst du diese 0, bist du sicher, dass es keine andere Ausgabe ist?

welcher Klassenname kommt bei der 0 heraus?
bei Remote denke ich immer gleich an dynamisch generierte Proxyklassen,

aber wenn dieser Konstruktor dort ausgeführt wird,
wird es schwer, keine Subklasse zu sein und damit nicht wenigstens BaseRemote zu implementieren 😉

wird etwa der Code herauskopiert? 😉
 
Code:
Class<?>[] interfaces = this.getClass().getInterfaces(); 
System.out.println(interfaces.length);

Ausgabe:0
 
beeindruckend, wie du alle meine weiterführenden Tipps und Fragen ignorierst (ok, müssen auch nicht genial sein)
und die bereits gegebene Info kommentarlos wiederholst 😉
 
Sorry war mir wohl zu selbstverständlich das bei this.getClass() die klasse der Instanz (z.B. namespace.xyz.SpecialicedRemote) bzw. this.getClass().getName() der entsprechende Name als String geliefert wird (was auch geschieht)... nur bei getInterfaces() und auch bei getClasses() kommt halt ein Klassenarray der länge 0 raus. Ich hab schon sichergestellt das es sich nicht um nen Anfängerfehler handelt. 😉

Das ganze ist bei mir auch so implementiert nur der Name der Klassen ist anders. Kanns an der VM liegen oder was... ich meine es ist doch eine sehr elementare Klasse die eigentlich funktionieren sollte.

ich poste mal die originalimplementierung steht ja kein Geheimnis drin...
Code:
super();
		// Search for all implemented Interfaces extending NexusDevice
		Vector<Class<?>> interfaces = new Vector<Class<?>>();
		Class<?>[] checkClass = this.getClass().getInterfaces();
		System.out.println(this.getClass().getName() + ":" + checkClass.length); //Ausgabe: de.pegasos.nexus.AbstractNexusDevice$1:0
		for(int i = 0; i < checkClass.length; i++)
		{
			System.out.println(checkClass[i]);
			if(ClassUtil.implementsInterface(checkClass[i], NexusDevice.class))
			{
				interfaces.add(checkClass[i]);
			}
		}
 
nochmal: hast du meinen Code ausgeführt, klappt es im einfachen Beispiel?

dann dürfte doch 'Kanns an der VM liegen oder was... ' wegfallen?

wiederum zu deinem Code, wie immer er ausfgeführt wird:
kommt 'ich bin' usw? was kommt dort für ein Klassenname?
 
Im Kommentar steht, dass this.getClass().getName()den String "de.pegasos.nexus.AbstractNexusDevice$1" leifert; offenbar handelt es sich bei this also um eine innerhalb von de.pegasos.nexus.AbstractNexusDevice deklarierte "anonymous inner class" und nicht um de.pegasos.nexus.AbstractNexusDevice selbst. Ist das so gewollt?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben