Ist es möglich, eine Klasse in Java zu laden und den Paketnamen/kanonischen Namen einer Klasse zu "fälschen"? Ich habe versucht, dies zu tun, der offensichtliche Weg, aber ich bekomme eine "Klassenname stimmt nicht überein" Nachricht in einem ClassDefNotFoundException
.Dynamisches Laden einer Klasse in Java mit einem anderen Paketnamen
Der Grund, warum ich das tue, versuche ich eine API zu laden, die in das Standardpaket geschrieben wurde, damit ich es direkt ohne Reflektion verwenden kann. Der Code wird mit der Klasse in einer Ordnerstruktur kompiliert, die das Paket und einen Paketnamenimport darstellt. dh:
./com/DefaultPackageClass.class
// ...
import com.DefaultPackageClass;
import java.util.Vector;
// ...
Mein aktueller Code ist wie folgt:
public Class loadClass(String name) throws ClassNotFoundException {
if(!CLASS_NAME.equals(name))
return super.loadClass(name);
try {
URL myUrl = new URL(fileUrl);
URLConnection connection = myUrl.openConnection();
InputStream input = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int data = input.read();
while(data != -1){
buffer.write(data);
data = input.read();
}
input.close();
byte[] classData = buffer.toByteArray();
return defineClass(CLASS_NAME,
classData, 0, classData.length);
} catch (MalformedURLException e) {
throw new UndeclaredThrowableException(e);
} catch (IOException e) {
throw new UndeclaredThrowableException(e);
}
}
Nein, ich habe keinen Zugriff auf die Quelle. Das Verschieben der Klassen in ein Verzeichnis funktioniert zur Laufzeit nicht, obwohl es anscheinend kompiliert wird. Ich würde lieber nicht die Klasse hacken, wenn möglich. –
Willst du sagen, dass das Ändern des Pakets einer Klasse zur Laufzeit kein Hack ist? Für mich ist die Frage nur, welcher ist der schlechtere Hack und dann den anderen ... – FelixM