Klasse aus String

Sunchezz

Bekanntes Mitglied
Halli hallo liebe java Anhänger,

irgendwie bin ich heute nacht beim einschlafen auf diese Frage gestoßen, mal schauen ob es jemand weiß...
hab auch schon was gefunden, aber wohl nich das was ich wirklich brauch.

Also, angenommen ich habe in einem Ordner eine .class datei!

Nun starte ich folgendes Programm... (ok, leicht vereinfacht)
Java:
public static void main(String[] args) {
  FileReader r = new FileReader(classFile)
  blabla...
  String s = r.read(); // kompletter Dateiinhalt
  Class  newClass = Class.parse(s); // So, diese Zeile is nun... naja, etwas meiner Fantasie entsprungen
  Object obj = newClass.newInstance();
}


Also, gibt es irgendeine möglichkeit zur laufzeit aus einem String eine Klasse zu machen?
Ich weiß ja das ich mit UrlClassloader und nem normalen classloader mir mit forName("Classname") die klasse auch so laden kann...
aber was nun wenn ich die klasse verschicken will... zum beispiel übers internet, kann ich dann irgendwie zur laufzeit daraus ne class machn, ohne sie in nem (temporären) file zu speichern?
also das der classinhalt nur in der JVM bleibt?

Hoffe meine Frage is klar geworden =)
 
Zuletzt bearbeitet von einem Moderator:

splinter

Mitglied
Das solltest du mit der JavaCompiler API hinkriegen, siehe z.b.:
Java Compiler API, Teil 1: Grundlagen

Wenn die Klasse aber in Byte-Code vorliegt reicht auch ein Classloader:

Java:
File classFile = new File("BlaBla.class");
InputStream in = new FileInputStream(classFile);

byte[] bytecode = new byte[classFile.length()];
in.read(bytecode); // oder entsprechend übers Netzwerk laden.

ClassLoader classloader = ClassLoader.getSystemClassLoader(); // oder anderen Classloader verwenden.
Class clazz = classloader.defineClass("BlaBla", bytecode, 0, bytecode.length);

Object obj = class.newInstance();
 
S

Spacerat

Gast
Irgendwo hatte ich mal diverse Classloader gefunden, die entweder mit dem Eclipse JDT Compiler oder mit dem Sun Compiler (com.sun.tools.javac.Main) arbeiten. Diese versuchten zunächst die Klasse zu laden. Gelang das nicht (Exception) wurde versucht die Klasse zu kompilieren und erneut versucht diese zu laden. Erst wenn alles fehl schlug wurde die ClassNotFoundException geworfen. Es ist gut möglich, dass dieses in seiner Gesamtheit ein riesiges Sicherheitsloch darstellte und ich den Code deswegen nicht mehr finde. Zumindest fand ich noch ein Beispiel, wie man den Sun Kompiler verwendet.
Java:
import com.sun.tools.javac.Main;
 
public class ToolsTest {
    public static void main(String[] args) {
        //Parameter analog zum normalen Aufruf von javac über die Konsole...
        Main.compile(new String[]{"C:/eclipse/workspace/testproject/src/ABC.java"});
    }
}
 

Sunchezz

Bekanntes Mitglied
ok, ich entschuldige mich mal für diverse unklarheiten^^

das entscheidene an meiner frage war eigentlich wie ich zur laufzeit eine klasse aus einem String interpretieren kann, die .class im ordner war eigentlich nur ein beispiel um zu verdeutlichen das ich den direken inhalt zur laufzeit in einem string habe...
also vergesst den file, ich habe nur den bytecode der klasse in einem String.

Hilft mir also die Compiler Api weiter?
das ich zur laufzeit Kompilieren kann ist mir klar!
Aber ich habe ja bereits den bytecode...
Alsso bräuchte ich im prinzip nen interpreter, aber das is ja eigentlich schwachsinn weil der ja schon läuft, also muss ich nur aus dem bytecode nur eine geladene klasse machen...

(ich glaube ich sollte wieder ins bett gehen, doch schon etwas spät um solche komplexen sachverhalte irgendwie in verständlich sätze zu packen!)

Also gute nach und danke schonmal!

EDIT:
Ok, lesen fällt zu dieser Uhrzeit auch nich mehr so leicht xD
ich sehe die Antwort die ich wollte hab ich von Splinter schon bekommen, ich werde das morgen mal testen.
Danke
 
Zuletzt bearbeitet:

Murray

Top Contributor
Wenn du den Bytecode in einem String hast, dann hilft dir Splinters Lösung ab Zeile 8. Das "bytecode"-Array muss eben nur nicht zuerst aus einer Datei gelesen werden, sondern kann mit getBytes() aus dem String entnommen werden.

Allerdings: bei Bytecode handelt es sich prinzipiell um irgendwelche Binärdaten; wenn man die in Strings wandelt und wieder zurück, dann könnte man Probleme bekommen, wenn man nicht in beide Richtungen das gleiche Encoding verwendet. Wie bekommst du denn den Bytecode in den String?
 
G

Gastredner

Gast
Allerdings: bei Bytecode handelt es sich prinzipiell um irgendwelche Binärdaten; wenn man die in Strings wandelt und wieder zurück, dann könnte man Probleme bekommen, wenn man nicht in beide Richtungen das gleiche Encoding verwendet. Wie bekommst du denn den Bytecode in den String?
Über einen Reader, würde ich wetten.
@TO: Lese die Datei über einen Stream in ein [c]byte[][/c] ein verwende dann splinters Lösung zum Definieren der neuen Klasse.
 

Sunchezz

Bekanntes Mitglied
Also ich bin nun ein wenig verwirrt hierrüber:

Java:
public static void main (String[] args) {
    byte[] bytecode = s.getBytes(); //s ist der String in den ich einfach zum testen mal ganz dreist
                                                      //den inhalt der class datei kopiert habe
    ClassLoader classloader = ClassLoader.getSystemClassLoader();
    Class clazz = classloader.defineClass("HalloWelt", bytecode, 0, bytecode.length, null);
}

Wenn ich das nun Kompiliere:
Code:
Loader.java:15:30: cannot find symbol
symbol  : method defineClass(java.lang.String,byte[],int,int)
location: class java.lang.ClassLoader
    Class clazz = classloader.defineClass("HalloWelt", bytecode, 0, bytecode.length);
                             ^
1 error

Ein blick in die API zeigt:
protected Class<?> || defineClass(String name, byte[] b, int off, int len) Converts an array of bytes into an instance of class Class.
(API: Java™ Platform Standard Ed. 6)
(Meine: jdk1.6.0_22)

Also was zur Hölle übersehe ich hier??
liegts daran das die Methode protected is?
Wenn ja, bin ich eigentlich gewohnt das mich der Compiler auf solche Schusselfehler hinweist...
Steh grad irgendwie aufm Schlauch!
 

Sunchezz

Bekanntes Mitglied
defineClass ist doch eine definierte Methode innerhalb der API, wenn ich das richtig sehe, hat das doch nix mit Reflections zu tun, wenn ich Reflections benutze, bekomm ich zur laufzeit dem Compiler unbekannte Klassen und anderes, aber der Compiler sagt mir ja gerade das er die Methode nicht finden kann...
 
G

Gast2

Gast
ja definiert ist sie schon, aber sie ist protected.
das heißt du kannst auf die methode nur zugreifen wenn du
- in der klasse selbst bist
- im selben package
- oder in einer unterklasse bist
 

splinter

Mitglied
Also was zur Hölle übersehe ich hier??
liegts daran das die Methode protected is?
Wenn ja, bin ich eigentlich gewohnt das mich der Compiler auf solche Schusselfehler hinweist...
Steh grad irgendwie aufm Schlauch!

Du musst deinen eigenen ClassLoader schreiben. Die Methode ist wohl protected damit nicht jeder Klassen in einen fremden ClassSpace laden kann wie er lustig ist. (Könnte man aber auch umgehen...)

Eigener ClassLoader:
Java:
public class MyClassLoader extends ClassLoader {

	public MyClassLoader() {
		super(MyClassLoader.class.getClassLoader());
	}

	public Class<?> defineClassFromArray(byte[] byteCode) {
		return defineClass(null, byteCode, 0, byteCode.length);
	}
}
 

Sunchezz

Bekanntes Mitglied
ja definiert ist sie schon, aber sie ist protected.
das heißt du kannst auf die methode nur zugreifen wenn du
- in der klasse selbst bist
- im selben package
- oder in einer unterklasse bist

Ja danke, aber das ist mir bekannt...
Der Compiler weist einen doch aber eigentlich darauf hin, wie dieses kleine Beispiel beweist:
Code:
JProgressBar bar = new JProgressBar();
bar.paintBorder(bar.getGraphics());
Code:
Loader.java:15:8: paintBorder(java.awt.Graphics) has protected access in javax.swing.JProgressBar
bar.paintBorder(bar.getGraphics());

Ich versuche einfach nur eine Methode aus der Api aufzurufen, und der Compiler sagt mir das sie nicht existiert!
Protected hin oder her!!!
Das ist es was mich stutzig macht!

Das ich das mit nem eigenen Classloader beheben könnte darauf bin ich auch schon gekommen, allerdings bin ich noch nicht dazu gekommen es zu testen!
Ich werde berichten^^
 
S

Spacerat

Gast
Also deine Fehlermeldung sagt dir nicht, dass die Methode nicht existiert. Sie sagt dir lediglich, dass ein Symbol nicht gefunden werden kann, was natürlich kein Wunder ist, da das geforderte Symbol in deine aktuelle Umgebung nicht publiziert wurde, weil, wie wir bereits wissen, die Methode protected ist. Natürlich sollte einen sogar schon die IDE im Vorfeld auf die Problematik hinweisen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
E Boolean aus Klasse A als String in Klasse B ausgeben Allgemeine Java-Themen 4
S Eine Klasse die jeden String nur einmal annimmt Allgemeine Java-Themen 4
A Klassen String Array in anderer Klasse verwenden Allgemeine Java-Themen 11
P Klasse aus String öffnen Allgemeine Java-Themen 8
S String in eine andere Klasse übergeben Allgemeine Java-Themen 25
P Objekt einer Klasse erzeugen, die als String vorliegt Allgemeine Java-Themen 3
multiholle Objekt einer Klasse anhand eines String erzeugen Allgemeine Java-Themen 3
V Aus String -> Objekt einer Klasse erzeugen Allgemeine Java-Themen 7
V Objekt einer Klasse, deren Name nur als String vorhanden Allgemeine Java-Themen 4
M Value als String in beliebige Klasse konvertieren Allgemeine Java-Themen 18
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben