Reflection Basic

  • Themenstarter java_newbie2008
  • Beginndatum
Status
Nicht offen für weitere Antworten.
J

java_newbie2008

Gast
Hi community,

ich brauche dringend euere Hilfe. Ich muss ein bestimmtes Package durchsuchen und dann mit Hilfe von Reflection für alle gefundenen Class-Dateien jeweils eine Instanz erzeugen. Über diese Instanzen muss ich dann eine bestimmte Methode aufrufen. Bisher hab ich folgendes gemacht :

Code:
public void instanceClass(String name) throws ClassNotFoundException, SecurityException, NoSuchMethodException{
    	if(grp_name.equals("grp8")) mClass = Class.forName("mypackage.forreflection.*");
    	Method myMethod[] = mClass.getDeclaredMethods();    	
    }

klappts leider net. Könnt ihr vlt weiter helfen ?

danke
 

Wildcard

Top Contributor
Ein Package ist etwas abstraktes, kein Pfad, oder ähnliches. Kurz: es geht nicht wenn du die Anforderung nicht einschränken kannst.
 
J

java_newbie2008

Gast
hi danke für deine Antwort. Kann man irgendwie alle Klassen die unter einem Package liegen auflisten ?

danke
 
J

java_newbie2008

Gast
Die Anforderung lautet :
Automatische Suche+Import von Klassen die unterm Package "forreflection" liegen

:(
 

Wildcard

Top Contributor
Und wie findest du die Klassen die ich unter diesem Package definiert habe?
Wenn du bestimmte Annahmen triffst, wie zum Beispiel das sich diese Klassen in Verzeichnis XY lokal verfügbar befinden, dann kannst du die Anforderung umsetzen, im allgmeinen Fall aber nicht.
 
J

java_newbie2008

Gast
gut ok.
Wie kann ich z.B wenn eine Klasse (dummy.class) unterm package "forreflection" liegt , mit Reflection zurückbilden?
ich mache so
mClass = Class.forName("forreflection.dummy");

kriege ich ClassNotFoundException was mache ich jez falsch ?
 
J

java_newbie2008

Gast
für reflection muss auch die Datei *.java in dem selben package liegen ?
 
J

java_newbie2008

Gast
Ich glaub es liegt am Classpath.Weil es geht nur dann wenn ich *.java in das Package kopiere. Wie kann ich dem Classpath hinzufügen ? damit das package erkannt wird

danke
 

Noctarius

Top Contributor
Hallo.
Was ich denke was gemeint ist sind alle Class-Files in dem Jar/Verzeichnis (entsprechendes Unterverzeichnis passend zum Packagenamen) aufzuzählen.

Mit Verzeichnisstruktur und Class-File Namen kannst du dann den Klassenpfad innerhalb der VM erzeugen z.B. angenommen mit /home/base als deinem Projektpfad:
/home/base/x/y/z/Demo.class -> x.y.z.Demo

Diese kannst du dann wieder instanzieren und deine gewisse Methode aus dieser Aufrufen.

Sagen wir mal, ich find die Aufgabe auch recht seltsam gestellt aber naja gut, die meisten Lehrer haben halt nicht so sonderlich praxisorientierte Aufgaben ;)
 

brauner1990

Bekanntes Mitglied
Wiederbelebung eines alten Threads. Ja ich weiß man sollte es nicht, aber besser als extra nochmals einen Aufzumachen.

Ist es mittlerweile möglich?
 

Volvagia

Top Contributor
Ist vielleicht eine blöde Idee, aber kann man nicht einfach per ZipFile die Jar öffnen, und nachschauen, was für *.class-Dateien darin liegen?
 
G

Gastredner

Gast
Wiederbelebung eines alten Threads. Ja ich weiß man sollte es nicht, aber besser als extra nochmals einen Aufzumachen.

Ist es mittlerweile möglich?
Nein.
Volvagias Vorschlag wäre jedoch eine Möglichkeit, das Durchsuchen von packages wenigstens "lokal", also innerhalb einer oder mehrerer Jars oder auch dem Dateisystem, zu ermöglichen.
 
S

SlaterB

Gast
wer sagt dass du das nicht sollst?
du sollst es gewiss nicht unüberlegt machen, aber wenn sinnvoll dann auch möglich, Themen sind ja bewußt nicht geschlossen

meiner Ansicht hat sich zum Stand dieser Frage aber seit Java-Version 1.0 im Jahre 1996 nichts geändert, und wird auch nicht mehr,
das ist keine technische Frage sondern eine abstrakte Betrachungsebene,
in anderen Programmiersprachen möglich?
 

Murray

Top Contributor
Ist vielleicht eine blöde Idee, aber kann man nicht einfach per ZipFile die Jar öffnen, und nachschauen, was für *.class-Dateien darin liegen?
Das geht, wenn alle Class-Files aus einem Jar-File gelesen werden. Sind die Klassen aber über mehrere Jar-Files verteilt, oder gibt daneben auch noch einzelnen Class-Files, dann müsste man wohl den Classpath analysieren alle darüber erreichbaren Verzeichnisse und Jar-Files einzeln analysieren. Wenn jetzt aber auch noch URLClassLoader im Spiel sind, die sich zur Laufzeit Klassen von irgendwo aus dem Netz holen, wird es noch schwieriger. Und da es prinzipiell ja beliebige eigene Classlaoder geben kann, die Bytecode auf irgendwelche Weise auch immer laden (z.B. aus einer Datenbank), muss es wohl bei Wildcards Aussage von 2008 bleiben: es geht nur, wenn man gewisse Annahmen trifft bzw. Einschränkungen bzgl. der verwendbaren Classloader macht; im Allgemeinen geht es nicht.
 

brauner1990

Bekanntes Mitglied
Ob dies in anderen Sprachen möglich ist, ka, aber ich hab gegooglet und in verschiedenen foren gesucht und es waren mind. immer 1,5 jahre vergangen.
 

brauner1990

Bekanntes Mitglied
Java:
public <T extends OberElternKlasse> void methodd(T o)  {
        try {
            Class<?> clas = Class.forName("PACKAGENAME" + o.getClass().getSimpleName() + "");
            Method m = clas.getDeclaredMethod("METHODNAME", o.getClass());
            Constructor<?> constructor = clas.getConstructor();
            Object newInstance = constructor.newInstance();
            m.invoke(newInstance, o);
        } catch (Exception e) {
            System.out.println(e.getClass());
        }
    }

So ist eine Lösung ffinde ich
 
S

SlaterB

Gast
eine Lösung wofür?
ich sehe als Hauptproblem "[..] ein bestimmtes Package durchsuchen und dann [..] für alle gefundenen Class-Dateien [..]"

edit:
Java:
     Class<?> clas = Class.forName("PACKAGENAME" + o.getClass().getSimpleName() + "");
->
Java:
     Class<?> clas = o.getClass();
?
 

brauner1990

Bekanntes Mitglied
Ist richtig SlaterB, sry... war nen Schritt schon wiedermal weiter... hoffe trotzdem das es die anderen Verstehen.
 

schalentier

Gesperrter Benutzer
in anderen Programmiersprachen möglich?

Logisch, z.B. in Ruby:

Code:
AModule.constants.select {|c| AModule.const_get(c).is_a? Class}

Wobei 'AModule' quasi ein Package ist. Zurueckgeliefert werden alle Klassen, die in diesem Module definiert wurden.

Zum Thema: JAR durchsuchen ist imho die einzige Moeglichkeit sowas unter Java zu machen. Allerdings muss man dann natuerlich ALLE JARs im Classpath durchsuchen.
 
S

SlaterB

Gast
@schalentier
auch unter Berücksichtigung der Java-Eigenschaften, also beliebiger ClassPath, dynamisches Nachladen zur Laufzeit usw?

wobei es wohl auch in Java letztlich nur eine Frage der Arbeit ist,
wenn eine Klasse mit Class.forName() oder sonst wie irgendwann irgendwo gefunden wird,
dann muss ja ein ClassLoader zu irgendeinem Zeitpunkt eine gewisse Menge an Verzeichnissen/ Jars durchsuchen,

genau diese Menge an Klassen und dann auch packages sollte dann zu einem Zeitpunkt X bekannt sein
und man kann man auch abschließend sagen was darin vorhanden ist oder was nicht,
sofern die Java-Klassen dazu selber nichts anbieten (eben weil sie vielleicht nicht eine solche Liste erstellen sondern nur bei bestimmten Klassen suchen) muss man notfalls mit eigenen FileReader von Grund auf anfangen, bei .class-Dateien nicht gerade simpel...,
innere Klassen, Jars, noch exotischere ClassPaths..

unmöglich sollte das dann doch nicht sein, ich korrigiere mich (gibts Widerspruch?),
aber Aufwand ist wohl unrealistisch da Java selber keine Gesamtsicht anbietet
(das könnte sich dann wirklich vielleicht irgendwann noch ändern ;) )
 
Zuletzt bearbeitet von einem Moderator:

tfa

Top Contributor
Was ist, wenn es gar keine class-Datei gibt, sondern der Bytecode aus einer Datenbank gelesen wird? Oder die Klasse kommt übers Netzwerk von einem Server per remote Classloading? Vielleicht wird der Bytecode erst auf Anforderung generiert (Ruby ist das ja noch um einiges dynamischer). Auch kann es viele verschiedene Classloader mit unterschiedlichen Klassenpfaden geben. Alles in allem nicht einfach allgemein zu lösen das Problem, es sei denn, man setzt sich enge Grenzen.
 
S

SlaterB

Gast
ByteCode aus Datenbank scheint mir analog, wenn ein ClassLoader dort nach Klasse Xy suchen kann, dann muss das ja irgendwie abfragbar sein, auch wächst der Inhalt der DB nicht zufällig,

dynamisch neu erzeugte Elemente sind ein Thema für sich, ob Java das selber macht oder eine Datei in den ClassPath kopiert wird,
oder anderes Programm mal eben eine neue Datei erstellt und kompiliert (gar ein User vorm PC mit Tastatur und Editor, nicht so schnell aber doch dasselbe ;) )
dass das nicht so direkt zu berücksichtigen ist, ist klar, da kann man durchaus annehmen dass es tatsächlich sinnvolle (nicht-genannte) Grenzen in der Originalfrage und der Nachfrage gibt

naja, langsam zuviel Erzählung von mir
 
Zuletzt bearbeitet von einem Moderator:

tfa

Top Contributor
ByteCode aus Datenbank scheint mir analog, wenn ein ClassLoader dort nach Klasse Xy suchen kann, dann muss das ja irgendwie abfragbar sein,
Na klar kann er nach Klasse Xy suchen, aber man kann nicht sagen, gib mir alle bekannten Klassen - es sei denn, man weiß genau, wie die DB aufgebaut ist und wie man sie abfragt. Naja, theoretisches Problem.
 

schalentier

Gesperrter Benutzer
@schalentier
auch unter Berücksichtigung der Java-Eigenschaften, also beliebiger ClassPath, dynamisches Nachladen zur Laufzeit usw?

Ja. Dieses 'constants' liefert eine Liste mit allen Konstanten, die innerhalb des Modules definiert wurden. Dazu gehoeren auch alle Klassen. Da bei Ruby quasi immer alles dynamisch geladen wird, liefert das halt immer die Klassen, die aktuell im Module drinne sind. Aber das is Ruby, net Java.

Ich wuerde mich eher fragen, wozu man das braucht. Und ob man es wirklich braucht, bzw ob es nicht etwas anders viel besser geht ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
B Reflection Java Basics - Anfänger-Themen 8
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
M Reflection Java Basics - Anfänger-Themen 8
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
T von Reflection zum Thread? Java Basics - Anfänger-Themen 5
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11
M Rest- Api mit HTTP BASIC Authentication Java Basics - Anfänger-Themen 16
G For Schleife-Basic Java Basics - Anfänger-Themen 11
B Rekursion Basic Java Basics - Anfänger-Themen 15
S Compiler-Fehler Basic- Taschenrechner/ Fehler Java Basics - Anfänger-Themen 8
S Basic- Taschenrechner? Java Basics - Anfänger-Themen 7
C Java Eingabeaufforderung-Basic Zwei Zahlen addieren Java Basics - Anfänger-Themen 2
M Java und Basic CVDMBF Java Basics - Anfänger-Themen 3
B Map, basic types & Object Java Basics - Anfänger-Themen 5
S Java Array Basic Java Basics - Anfänger-Themen 5
U Visual-Basic Programm mit Java steuern Java Basics - Anfänger-Themen 8
J Basic I/O ;-) Java Basics - Anfänger-Themen 11
P Very Basic Java Basics - Anfänger-Themen 5
P Äquivalent zu Visual Basic Collection Java Basics - Anfänger-Themen 6
2 rmi basic frage Java Basics - Anfänger-Themen 3
thE_29 visual basic verknüpfung in java Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben