Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
bisher habe ich das Class-Objekt mit Class.forName("package.klasse"); erstellt. was mir fehlt ist eine idee, um von einem File-Objekt auf einen String oder so zu kommen, damit ich eine entsprechende Instanz von Class instanziieren kann. ???:L
Achso, also mit einem "URLClassLoader" kannst du die Datei mal ins System bringen. Wenn du aber den Namen der Klasse nicht kommst, kommst du IMHO auch nicht über die *.class Datei heran (solange du sie nicht selbst parst, was aber nicht trivial ist :wink: ).
Wenn du die *.class-es selbst herstellst: ich würde da noch irgendeine Textdatei hinzupacken welche die Klassennamen beinhaltet.
hm..naja. eigentlich sollte es mal mit jeder beliebigen klasse funktionieren. kann natürlich verlangen den voll qualifizierten namen anzugeben, aber das ist ober-spacko /
auf jeden fall aber habe ich auch immer die entsprechende *.java datei zur verfügung. kann ich hieraus nicht irgendwie den vollen klassennamen ableiten oder eben ein Class-Objekt bekommen?
was hast du mit "ins system bringen" gemeint?
und: findClass(String name) in URLClassLoader verlangt wahrscheinlich auch den vollen namen der klasse, also mit package und so?
klar, aber das bringt mir kein ergebnis wie zb "java.lang.String" oder "myPackage.Testklasse". aber genau soetwas brauche ich offensichtlich, um ein Class-Object erstellen zu können :bahnhof:
Wenn du in der "*.java" noch nach "package" suchst, hast du den ersten Teil des Namens, und mit dem Ergebnis von "public class" zusammen solltest du einen ganzen Namen bauen können.
Mit dem "ins System bringen" meine ich: dem Programm sagen, wo die Class-Datei überhaupt ist, und sie laden können. Bei einem URLClassLoader kannst du ebenfalls "loadClass" benutzen, wie bei jedem anderen ClassLoader.
trotzdem: wofür brauche ich die suche nach "public class"? macht hier ein extends zb einen unterschied? sonst kann ich ja einfach den dateinamen nehmen..
bsp:
Code:
package myPackage;
public class KlasseA extends java.lang.Compiler {
=> hier wäre der volle name doch "myPackage.KlasseA", oder? ???:L
hm..naja. eigentlich sollte es mal mit jeder beliebigen klasse funktionieren. kann natürlich verlangen den voll qualifizierten namen anzugeben, aber das ist ober-spacko /
@Illuvatar: daran habe ich auch schon gedacht. in meinem falle ist das aber kein problem, da das tool letztlich den quellcode der klasse in textdateien speichert, die wiederum in einen ordner mit dem klassennamen stecken (der wiederum im ordner mit dem namen des packages. egal.)
jedenfalls macht es zunächst nichts, wenn methoden von KlasseA im Ordner für KlasseB abgelegt sind. kann später einfach eine weitere ebene einführen (was ich sowieso vorhabe, wegen inneren klassen).
@Murray: ober-spacko, weil ich dann die datei nicht mehr mit einem JFileChooser auswählen kann, bzw. dieses auswählen ziemlich sinnlos ist. müsste ich doch von der auswahl (=> zb. einen File C:\eclipse\meinProjekt\meinPackage\meineKlasse.class) wieder 1 ebene nach oben gehen um dann meinPackage.meineKlasse.class laden zu können..
Danke trotzdem. werde es dann wohl erstmal so wie weiter oben beni beschrieben hat. also aus der quelldatei das package auslesen. mal schauen..
Wenn Du mit dem JDK (nicht JRE) arbeitest, dann geht es möglicherweise auch ohne Source-File: javap.exe akzeptiert nicht nur vollständige Klassennamen, sondern - warum auch immer - eben auch den Namen ohne Package (und ohne die Erweiterung ".class").
Wenn Du jetzt also eine Class-Datei auswählt hast, dann könntest Du per Runtime.exec javap.exe starten und den Output auswerten. Alternativ könntest Du auch in den (eigentlich nicht öffentlichen) Sun-Klassen suchen, ob sich da nicht eine Klasse findet, die das etwas abkürzt - die Tools im jdk\bin sind ja meist nur Wrapper um Java-Klassen. Ein heisser Kandidat wäre sun.tools.javap.Main aus jdk\lib\tools.jar
allerdings komme ich mit dem URLClassLoader noch nciht so richtig klar (der Fehler steht ja im code kommentiert).
Ich müsste doch auch irgendwo angeben, in welchem Verzeichnis sich zb struktoGen.FileSplitter befindet. Aber wie kann ich das machen?
.. aber eben nur, wenn ich im JFileChooser eine Datei auswähle, die in C:\eclipseworkspace\StruktoGen liegt.
wie kann ich hier also deinen anderen "pfad" angeben, in dem die gewählte klasse gesucht werden soll?