Dynamisches Laden einer Klasse in Java mit einem anderen Paketnamen
Ist es möglich, eine Klasse in Java zu laden und den Paketnamen / kanonischen Namen einer Klasse zu "fälschen"? Ich habe versucht, dies auf offensichtliche Weise zu tun, aber ich erhalte die Meldung "Klassenname stimmt nicht überein" in einemClassDefNotFoundException
.
Der Grund, warum ich das tue, ist, dass ich versuche, eine API zu laden, die im Standardpaket geschrieben wurde, damit ich sie direkt verwenden kann, ohne Reflektion zu verwenden. 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 lautet 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);
}
}