unbekannter Befehl zur Compilezeit

elischa

Mitglied
Hallo Leute,
ich versuche in meinem Plugin eine erst zur Laufzeit bekannt gewordene Klasse nach Annotationen zu durchsuchen. Folgende Annotationsdefinition:
Code:
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Documented
@Retention(RUNTIME)
@Target({ TYPE, METHOD })

public @interface Base {
   String summary();
   String description();
}

die unbekannte Klasse, hier: Using.java, Using.class, der Name jedoch erst zur Laufzeit bekannt:

Code:
@Base(summary="summary1234", description="description4321")
public class Using {
}

der Runner der die unbekannte Klasse ausließt:

Code:
import java.io.File;
import java.lang.annotation.Annotation;

public class Runner {

   public static void main(String[] args) {
       
       // der Name "Using" ist noch unbekannt,
       // bekomme den Namen erst zur Laufzeit, als File bzw. String
       // bekomme zur Laufzeit also den real Pfad der existierenden .class und .java Datei
       
       // wie kann ich "Using" ersetzen ?
       // brauche quasi sowas in der Art:
       
       // Annotation[] anno = "myUnknownFileString".class.getAnnotations();
       
       Annotation[] anno = Using.class.getAnnotations();
       
       for(int i=0; i<= anno.length-1; i++) {
           System.out.println(anno[i]);
       }
   }
}

Würde mich freuen, wenn jemand einen Tip hätte, wie ich das hier bekannte "Using" durch den erst dynamisch erhaltenen unbekannten Namen, also "String" oder "File" ersetzen könnte. Ich habe quasi schon zur Laufzeit die unbekannte .java Datei und die .class Datei mit Pfad extrahieren können, kriege sie aber nicht ausgelesen.

Ich habe hier noch was gefunden, was ähnlich ist:
https://www.forum-3dcenter.org/vbulletin/showthread.php?t=97453

Danke.
 

mrBrown

Super-Moderator
Mitarbeiter
z.B. mit Class.forName("Using"); gibt dir die Klasse, damit kannst du dann weiterarbeiten (wobei du das package von Using noch angeben musst)
 

elischa

Mitglied
ahh wunderbar, ich komme fast ran, wenn's jetzt wirklich "Using" ist, und diese im package "pack01" liegt
bekomme ich für
Code:
String string00 = (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getName());
       System.out.println(string00);
String path = System.getProperty("user.dir").concat("\\runtime-EclipseApplication\\");
       System.out.println("~~~~"+ path);
System.out.println(foundClassFile.getPath());
       System.out.println(foundClassFile.getAbsolutePath());
       System.out.println(foundClassFile.toPath());
       System.out.println(foundClassFile.toURI());
       System.out.println(foundClassFile.lastModified());

folgende Pfade:
Code:
~~~~C:\Users\<user>\Desktop\runtime-EclipseApplication\
Using.java
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\src\pack01\Using.java
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\src\pack01\Using.java
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\src\pack01\Using.java
file:/C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/src/pack01/Using.java
1490727442369
Using.class
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\bin\pack01\Using.class
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\bin\pack01\Using.class
C:\Users\<user>\Desktop\runtime-EclipseApplication\javaproject\bin\pack01\Using.class
file:/C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/bin/pack01/Using.class
1490727442541
Using

bräuchte nur noch den Aufruf mit packaging, erste Idee wäre:
Class.forName("pack01\\"+classString).getName()
er findet's aber noch nicht ganz, und meldet:
java.lang.ClassNotFoundException: pack01\Using cannot be found by ....

bräucht noch nen kleinen Tip wie ich das packeging im Aufruf richtig einbeziehe. Dankeschöö.
 

mrBrown

Super-Moderator
Mitarbeiter
Liegt die Klasse nicht zur Laufzeit im ClassPath? Dann musst du noch einen passenden ClassLoader erstellen, da kannst du URLClassLoader für nutzen...


Die Angabe mit package ist einfach nur pack01.Usage.

BTW: In Pfaden einfach / nutzen, \\ ist überflüssig.
 

elischa

Mitglied
die Pfade habe ich halt ausgeben lassen um sich zu orientieren, welche Datei/Class/File/String/URL/Path zu untersuchen ist, diese bekomme ich auch wunderbar raus, nur die tatsächliche Untersuchung auf diesem Objekt kriege ich nicht ausgeführt, wenn ich im PluginCode schreibe:
Annotation[] anno = pack01.Using.class.getAnnotations();
ist "pack01.Using" unbekannt
mit Class.forName("").getName() komme ich fast hin, bräuchte glaub' nur noch den richtigen String zur untersuchten Class?Datei. Was gebe ich da an, die .java Datei, die .class Datei, oder "pack01\\"+classString
oder "./pack01/"+classString, die URL oder irgendwas in der Art müsst' es glaub sein.
Weil er wirft mir ne ClassNotFoundException aber die Klasse ist da, hab ja alle Infos sowohl zur java Datei als auch zur Class File.

Die Idee ist eigentlich, dass mein Plugin installiert wird, eine PluginAction ausgeführt wird und daraufhin geguckt wird: was ist im Editor offen, eine "Using.java", gib mir die .class und die .java Datei -> found, die Datei kann eine Annotation enthalten, gib mir die Annotation und sende sie an JIRA ab.

please noch 'ne Idee für den Aufruf Class.forName("").getName() mit richtigem Parameter, also quasi "/pack01/Using.java" oder "/pack01/Using.class" oder so, weil es klappt fast.

PS: achja der Ordner "runtime-EclipseApplication" ist später bei release der workspace Ordner der untersucht wird, jetzt zum testen ist es halt die lokale runntime
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Du musst einen ClassLoader für den Ordner, in dem die Klassen liegen, erstellen.

Über den kannst du dann die Klassen laden mit Class.forName("pack01.Using"), ".java", ".class", "/" haben da nichts mehr drin zu suchen ;)
 

elischa

Mitglied
niceee habe die Using.java in der Runntime aus dem pack01 verschoben ins (default package) dann habe ich momentan in der Using.java mal nur ne Ausgabe anstatt der Annotation drin also
Code:
// im default package
public class Using {
   
    static   {
       System.out.println( "class to load !!!" );
    }
}

und im Plugin Code die Funktion:
Code:
public static Object newInstance( String path, String classname ) throws Exception {
     
       URL url = new File( path ).toURI().toURL();
       URLClassLoader cl = new URLClassLoader( new URL[]{ url } );
       Class<?> c = cl.loadClass( classname );
       return c.newInstance();
       
   }

und den Aufruf im Plugin Code:
Code:
try {
           
           newInstance( "C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/bin/", "Using" );
           
       } catch (Exception e) {
           e.printStackTrace();
       }

führt mir dann die "unbekannte" Klasse aus mit
class to load !!!

nur noch die Pfade und das package anpassen und dann is glaub' nich mehr weit...
 

elischa

Mitglied
hoff' die multiposts sind nicht so schlimm...
hab das packaging rausbekommen, glaub' wenn die .java Datei im Package pack01 drinne is, dann funzt es mit dem Aufruf:
newInstance( "C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/bin/", "pack01.Using" );
das pack01 eingehängt im Pfad funzt komischerweise nicht
 

elischa

Mitglied
versteh's nicht, krieg' so ziemlich alles ausgelesen und sogar ne Instanz ausgeführt nur die Annotation nicht, auch keine Standardannotation...hänge quasi immernoch an diesem Befehl
Annotation[] anno = <Using>.class.getAnnotations();
egal was ich für <Using> einhänge, keine Annotation weit und breit...

oh je...hmm was mir noch einfallen würde, die .java Datei hauruck nach dem String "@Base..." zu durchsuchen...
 

mrBrown

Super-Moderator
Mitarbeiter
Der Workaround ist aber auch mehr schlecht als recht...

Wie hast du denn versucht, die annotation abzufragen?
 

elischa

Mitglied
joa find's jetzt auch nich wirklich cool, aber funzt. So vom Bauchgefühl sind da glaub dutzende String leaks, bzw unbehandelte Fälle. Hab die Annotation quasi mit folgendem Code ausgelesen:
Code:
public String findAnnotation(File afile) {
       
       String trimmedFile = afile.getName().substring(0, afile.getName().length()-5);
       String line00 = "";
        String line = "";
       
       try {
           FileReader fr = new FileReader(afile);
           BufferedReader br = new BufferedReader(fr);
           
           
           while (  true  ) {
               
               if((line = br.readLine())==null) {
                   break;
               }
               else {
                   
                   if (line.contains("class "+trimmedFile+" {")) {
                       break;
                   }
                   else {
                       
                       if(line00.contains("@Base(")) {
                           continue;
                       }
                       else {
                           line00 = line;
                       }
                       
                   }
                   
               }
               
           }
           
           br.close();
           }
           catch (IOException ioe) {
               System.out.println(ioe.getMessage());
           }
       
       
       return line00;
       
   }
Die @base Definition ist nur ein Beispiel, eigentlich ist die Annotationsdefinition bei mir eine andere.
Kann deshalb sein dass die Indexe oben nicht passen.

Wenn ich dann die ganze Annotation aus der .java Datei gelesen habe, dann mache ich an einer anderen Stelle dann folgende Extraktion für den Inhalt, also für summary und description:
Code:
       int x = annotation.indexOf("\"");
       String b = annotation.substring(x+1, annotation.length());
       int y = b.indexOf("\"");
       String sum = b.substring(0, y);
       stringArray[0] = sum;
       //System.out.println(sum);
       
       String c = b.substring(y+1, b.length());
       int z = c.indexOf("\"");
       String desc = c.substring(z+1, c.length()-2);
       stringArray[1] = desc;
       //System.out.println(desc);

Wenn da bischen was verschoben is, funzt es quasi kaum noch aber der Kern ist dynamisch und zwar die unbekannte .java Datei. Das Absenden klappt auch wunderbar. Muss da aber jetzt warscheinlich eh noch nen Haufen Synchronisationszeug machen und da bin ich froh, wenn ich wenigstens die handlebare .java Datei habe.
 

mrBrown

Super-Moderator
Mitarbeiter
Der Weg ist trotzdem scheiße.

Die Class laden funktioniert, wie du ja selbst sagst, und für diese kannst du auch die Annotationen abfragen. Geh doch nicht so einen riesen Umweg...
 

elischa

Mitglied
heja schon irgendwie, mir gefällt's auch nicht so richtig...

ich wüsst halt nicht was ich da noch anstellen kann...ka vieleicht enthält die Instanz selbst von "pack01.Using" keine Annotation, weil die Annotation vor der Klasse steht, vielleicht ist pack01.Using in irgendeinem Pfad z.B. ../src/pack01/pack01.Using? Oder ich muss die URL? der .class? Datei mit dem ClassLoader laden, keine Ahnung wo ich da anfangen soll zu suchen :D
 

elischa

Mitglied
jap mit dem Code hier
Code:
try {
  newInstance( "C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/bin/", "pack01.Using" );
  System.out.println( Class.forName("pack01.Using").getName() );
       } catch (Exception e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

Die Instanz wird erstellt und ausgeführt, und ich kriege "class to load !!!" angezeigt und gleich danach will ich den Namen dieser geladene Class ausgeben und er wirft er mir den Fehler java.lang.ClassNotFoundException: pack01.Using cannot be found by...
Soll ich anstelle von System.out.println( Class.forName("pack01.Using").getName() );
was anderes probieren oder so ?
 

elischa

Mitglied
hmm in der newInstance Methode sehe ich vor lauter Bäumen den Wald nicht, muss mich bischen auf's Ohr haun, probier's aber auf jeden noch aus.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
       URL url = new File( path ).toURI().toURL();
       URLClassLoader cl = new URLClassLoader( new URL[]{ url } );
       Class<?> c = cl.loadClass( classname );

Hier hast du bereits deine gewünschte Klasse, die kannst du einfach Weiternutzen...
 

elischa

Mitglied
das hat dann doch wunderbar geklappt mit der newInstance Methode, war quasi wirklich schon alles da, nur habe ich die Annotationsdefinitionen als jar package eingebunden, sie sind dann sichtbar und können benutzt werden, sogar Instanzen werden ausgeführt, aber die Belegungen der Annotation selbst sieht er nicht. Man muss quasi die Annotationsdefs als .java Source Dateien in der Runntime also im bearbeiteten Projekt normal drin liegen haben, dann sieht er die Belegungen und gibt sie mit der newInstance Methode auch aus.

in dieser Class Datei:
newInstance( "C:/Users/<user>/Desktop/runtime-EclipseApplication/javaproject/bin/", "pack01.Using" )
kann ich also eine Annotation belegen, weil ich die importierten Klassen während der Belegung sehe, aber nach dem kompilieren sieht er die importierten jars glaub nicht mehr, deshalb muss die source .java Annotation im Projekt enthalten sein, also so denke ich mir dass es funzt. Aber ich glaube da ist noch mehr mit Verursacher, verursachende Umgebung, Umgebung in die zurückgegeben wird usw.
Auf jedenfall thanks für die Tips, hat sich jetzt einigermaßen geklärt.

---edit---
der import in der runtime in der bearbeiteten Datei, wo man die Annotation belegt,
wäre dann quasi:
import annotypedefs.*;

mit dem package annotypedefs wo dann die Definitionen einfach als java source Dateien drin liegen
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Das klingt nach alles sehr Merkwürdig...Die Source-Datein müssen sicher nicht zur Runtime verfügbar sein, wenn das nötig ist, machst du irgendwas falsch.

Ich hab allerdings auch bei der Hälfte der Begriffe keine Ahnung, was du damit meinst.
Annotationen kann man nicht "belegen", was meinst du damit? Genausowenig versteh ich "Verursacher" und "Umgebung"...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ArrayList mit unbekannter Menge an Arrays die Arrays vergleichen Java Basics - Anfänger-Themen 9
C Unbekannter "Konstruktor"?? Java Basics - Anfänger-Themen 10
A Unbekannter Array fehler Java Basics - Anfänger-Themen 10
L Variablen Unbekannter Fehler Java Basics - Anfänger-Themen 14
L Operatoren Übungsklausuraufgabe, unbekannter Operator Java Basics - Anfänger-Themen 13
N Datentypen Frage bezüglich unbekannter Fehlermeldungen. Java Basics - Anfänger-Themen 1
C Intelligentes Erstellen von Formel mit unbekannter Variable Java Basics - Anfänger-Themen 37
R Array mit unbekannter Dimension Java Basics - Anfänger-Themen 6
N Array bei unbekannter Länge Java Basics - Anfänger-Themen 4
F Variablen von unbekannter Anzahl deklarieren Java Basics - Anfänger-Themen 9
J Arrays mit unbekannter Länge Java Basics - Anfänger-Themen 2
G String.insert an unbekannter Stelle Java Basics - Anfänger-Themen 5
G Char oder Byte Array mit unbekannter länge erstellen? Java Basics - Anfänger-Themen 1
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
Viktor A. Kaiser Ampelschaltung mit if-Befehl Java Basics - Anfänger-Themen 11
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
Lion.King switch-Befehl Java Basics - Anfänger-Themen 6
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
F Terminal Windows per Befehl schließen? Java Basics - Anfänger-Themen 9
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
K Subklassen mit einzigem Befehl addieren Java Basics - Anfänger-Themen 6
F cmd Befehl ausführen Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
D Input/Output Befehl aus Benutzereingabe herausfiltern Java Basics - Anfänger-Themen 12
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
N Javac -version der Befehl ist entweder falsch geschrieben oder...... Java Basics - Anfänger-Themen 8
O Methoden Runtime.getRuntime().exec(befehl); Java Basics - Anfänger-Themen 6
L Ist an diesem Befehl irgendwas falsch? Java Basics - Anfänger-Themen 2
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
B Copy Paste Befehl Java Basics - Anfänger-Themen 6
O String: Befehl und Wert erkennen. Java Basics - Anfänger-Themen 4
D Erste Schritte Zuul - 2ten Befehl einführen Java Basics - Anfänger-Themen 68
D Erste Schritte Befehl back implementieren Java Basics - Anfänger-Themen 18
B Befehl um ein Befehl abzubrechen Java Basics - Anfänger-Themen 2
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
S Befehl current: Java Basics - Anfänger-Themen 3
Silvascus Void Methode einem Stringparameter im syso-Befehl hinzufügen Java Basics - Anfänger-Themen 3
slejden Erste Schritte der Befehl import Java Basics - Anfänger-Themen 2
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
J Problem WIE ohne Goto-Befehl lösbar? Java Basics - Anfänger-Themen 6
N Benötige eine Alternative für einen GOTO Befehl Java Basics - Anfänger-Themen 2
O CMD Befehl javac Java Basics - Anfänger-Themen 3
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
D Klassenmethode: Befehl erkennen, dann int zurückgeben Java Basics - Anfänger-Themen 2
C Desktopiconwechsel ohne Befehl Java Basics - Anfänger-Themen 0
V Schlüsselworte Befehl Ignorieren? Java Basics - Anfänger-Themen 10
B JDK installieren Befehl java funktioniert nicht Java Basics - Anfänger-Themen 15
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
C CMD Befehl + Variable im Java-Code ausführen Java Basics - Anfänger-Themen 8
S Methoden auf befehl ausführen Java Basics - Anfänger-Themen 7
iB0T Eine Art Goto Befehl! Java Basics - Anfänger-Themen 27
H Exit Befehl in eigener Konsole Java Basics - Anfänger-Themen 9
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Schlüsselworte Befehl this Java Basics - Anfänger-Themen 8
E CMD Befehl über Java ausführen? Java Basics - Anfänger-Themen 4
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
D Hilfe zu Java Befehl In.open Java Basics - Anfänger-Themen 2
B Javadoc-Befehl unter Ubuntu Java Basics - Anfänger-Themen 2
I Befehl/Methode "los()" Java Basics - Anfänger-Themen 17
A Befehl gesucht....wie komme ich an Folgendes Objekt? Java Basics - Anfänger-Themen 6
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
S javac Befehl Java Basics - Anfänger-Themen 7
C Befehl zum Verlassen einer Schleife Java Basics - Anfänger-Themen 27
W Befehl ausführen bei Mausklick + gedrückte Strg-Taste Java Basics - Anfänger-Themen 2
B Befehl mit Priorität aufrufen Java Basics - Anfänger-Themen 4
I Befehl wird erst nach dem Ausführen einer Funktion ausgeführt Java Basics - Anfänger-Themen 4
K Problem mit h2 DB Insert Befehl Java Basics - Anfänger-Themen 6
B Befehl für vorselektierten Radiobutton Java Basics - Anfänger-Themen 2
H if-Befehl mit Buttongroup Java Basics - Anfänger-Themen 9
B assert befehl in netbeans Java Basics - Anfänger-Themen 3
M Objekto.Programm. Return-Befehl Java Basics - Anfänger-Themen 4
F Kann String in Befehl wandeln? Java Basics - Anfänger-Themen 12
F Simpler DrawLine - Befehl!? Java Basics - Anfänger-Themen 9
M Befehl zum Einlesen von Benutzereingaben Java Basics - Anfänger-Themen 1
M Befehl zum Fenster schließen? GUI Java Basics - Anfänger-Themen 3
L Do while Befehl verkürzen? Java Basics - Anfänger-Themen 16
-horn- Befehl an CMD übergeben Java Basics - Anfänger-Themen 15
A [Fehlermeldung]Sleep-Befehl Java Basics - Anfänger-Themen 4
B Befehl "javac" wird nicht erkannt Java Basics - Anfänger-Themen 14
S Befehl "javac" funktioniert und Windows 7 nicht? Java Basics - Anfänger-Themen 3
K Terminal Befehl mit Java unter Mac ausführen Java Basics - Anfänger-Themen 18
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
X Befehl import Java Basics - Anfänger-Themen 21
Antoras Explizite Typenumwandlung in einem Befehl Java Basics - Anfänger-Themen 3
A Button einen Befehl zuordnen Java Basics - Anfänger-Themen 7
N suche Datums befehl Java Basics - Anfänger-Themen 8
H Problem mit Tastatur Befehl Java Basics - Anfänger-Themen 11
J Kill befehl Java Basics - Anfänger-Themen 44
G java shell script starten und befehl übergeben Java Basics - Anfänger-Themen 3
Z Ant java -classpath befehl Java Basics - Anfänger-Themen 2
X JOptionPane.showMessageDialog(); - Import Befehl? Java Basics - Anfänger-Themen 4
K Befehl um am Anfang einer Methode zu kommen? Java Basics - Anfänger-Themen 9
G Befehl für Ende bei Switch-Auswahl Java Basics - Anfänger-Themen 11
K fehler mit der Befehl Console Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben