Reflection und "extends" Schlüsselwort

yogle

Neues Mitglied
Hallo zusammen,

ich bin noch ziemlicher Anfänger, doch bevor ich völlig verzweifle, dachte ich schreib ich lieber mal hier rein, vielleicht kann mir ja jemand helfen. Ich möchte per Reflection mehrere Klassen dynamisch laden und soweit klapp das auch. Stecken bleibe ich aber wenn ich meine eigene Klasse, welche eine Subklasse für eine der dynamisch geladenen ist, in einem Funktionsaufruf verwenden möchte. Ohne Reflection sieht der Code so aus:

Watcher.java
Java:
// Diese drei Klassen möchte ich dynamisch laden!
import com.IActivityController
import com.IActivityManager
import com.ActivityManagerNative

public class Watcher
    // Hier ist die wichtige (Sub-)Klassenbezeichnung!
    private class ActivityWatcher extends IActivityWatcher.Stub {
	@Override
        public boolean activityStarting(Intent intent, String pkg) {
               System.out.println(intent + " in package " + pkg);
               return true;
        }

        @Override
	public boolean activityResuming(String arg0) throws RemoteException {
		// TODO Auto-generated method stub
		return true;
	}

        @Override
	public boolean appCrashed(String arg0, int arg1, String arg2,
			String arg3, byte[] arg4) throws RemoteException {
		// TODO Auto-generated method stub
		return true;
	}

        Override
	public int appNotResponding(String arg0, int arg1, String arg2)
			throws RemoteException {
		// TODO Auto-generated method stub
		return 0;
	}
    }

    void run() {
        IActivityManager aM = ActivityManagerNative.getDefault();
 
        aM.setActivityController(new ActivityWatcher());       
    }

Die Klassen "ActivityManagerNative", "IActivityManager" und insbesondere "IActivityController" möchte ich nun aber per Reflection laden. Das ist mein derzeitiger Code:

ActivityWatcher.java hier gehen die @Override Annotiations und das "extend IActivityWatcher.Stub" nicht mehr....
Java:
public class ActivityWatcher {
	public boolean activityStarting(Intent intent, String pkg) {
        System.out.println(intent + " in package " + pkg);
        return true;
    }

	public boolean activityResuming(String arg0) throws RemoteException {
		// TODO Auto-generated method stub
		return true;
	}

	public boolean appCrashed(String arg0, int arg1, String arg2,
			String arg3, byte[] arg4) throws RemoteException {
		// TODO Auto-generated method stub
		return true;
	}

	public int appNotResponding(String arg0, int arg1, String arg2)
			throws RemoteException {
		// TODO Auto-generated method stub
		return 0;
	}
}

Watcher.java
Java:
public class Watcher {
    void run() {
      // Access our class loader
      ClassLoader classLoader = Watcher.class.getClassLoader();  
        
      try {
       Class<?> classIActivityController = classLoader.loadClass("android.app.IActivityController");
       System.out.println(classIActivityController.getName());
            
       Class<?> classActivityManagerNative = classLoader.loadClass("android.app.ActivityManagerNative");
       System.out.println(classActivityManagerNative.getName());
            
       Class<?> classIActivityManager = classLoader.loadClass("android.app.IActivityManager");
       System.out.println(classIActivityManager.getName());
            

       // "ActivityManagerNative.getDefault"
       java.lang.Class<?>[] parameterType = null; 
       Method methGetDefault = classActivityManagerNative.getMethod("getDefault", parameterType);

       // "IActivityManager.setActivityController"
       Method methSetActivityController = classIActivityManager.getMethod("setActivityController", 
                    	classIActivityController);
           
         
       // Call "ActivityManagerNative.getDefault", function is static -> pass null as instance
       java.lang.Object[] argument = null;
       Object oIActivityManagerInst = methGetDefault.invoke(null, argument);
            
       
       // Class<?> subclass = Class.forName("com.systemapp.ActivityWatcher").asSubclass(classIActivityController); <-- Wirft eine ClassCastException
            
       //  methSetActivityController.invoke(oIActivityManagerInst, subclass);
            
    } catch(ClassNotFoundException e) {
       Log.e("Watcher", "ClassNotFoundException!");
       e.printStackTrace();
     } catch(NoSuchMethodException e) {
       Log.e("Watcher", "NoSuchMethodException!");
       e.printStackTrace();
     } catch(InvocationTargetException e) {
       Log.e("Watcher", "InvocationTargetException!");
       e.printStackTrace();
     } catch(IllegalAccessException e) {
       Log.e("Watcher", "IllegalAccessException!");
       e.printStackTrace();
     }
}

Kann mir jemand sagen wie ich mit "setActivityController" meine eigene Klasse registriere um, später für bei "activityStarting" aufgerufen werden zu können?

Gruß
yogle
 

Landei

Top Contributor
Ich verstehe nicht ganz, was du erreichen willst, und ob du überhaupt Reflection brauchst. Wahrscheinlich lässt sich dein Problem bereits so lösen:
- ein Interface Bla schreiben, das deine dynamische Klasse implementiert
- Bla bla = (Bla) Class.forName("my.ultra.cool.DynamicClass").newInstance(); //wenn es einen Defaultkonstruktor gibt
- danach lassen sich an bla ganz normal Methoden aufrufen

Method.invoke ist nur dann nötig, wenn deine Klasse keinerlei Interface entspricht (etwa Tools wie Objekt-Inspektoren). Da es sich um deine eigenen Klassen handelt, sollte es kein Problem sein, ein Interface anzugeben.

Übrigens solltest du dir mal SPI (service provider interface) angucken, vielleicht ist das schon das, was du brauchst. Damit kann man ein Interface vorgeben, und passende Klassen aus Packages, die im Classpath liegen und eine entsprechende Definition in META-INF mitliefern, zur Laufzeit "entdecken".
 

Landei

Top Contributor
Die Frage ist nicht, ob sie von dir sind, sondern ob sie ein vernünftiges Interface implementieren, dass du verwenden könntest. Dann ginge der von mir beschriebene Weg. Ansonsten musst du wirklich mit Method.invoke rumhantieren.

Was mich stutzig macht ist der Satz "Stecken bleibe ich aber wenn ich meine eigene Klasse, welche eine Subklasse für eine der dynamisch geladenen ist...". Von dynamischen geladenen Klassen kannst du nicht einfach eigene Klassen ableiten. Ist auch logisch: Der Compiler muss die Superklassen deiner Klasse zur Compilezeit kennen, woher soll er sonst die Informationen nehmen, was reingehört und was nicht? Natürlich gibt es Mittel und Wege (spontan fällt mir DynamicProxy ein), aber um da zu helfen müsstest du die Situation etwas ausführlicher erklären...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben