/**
* Diese Methode ermittelt den voll qualifizierten Klassennamen.
* Dazu wird die Klasse kurz geladen.
* @param sFileName Dateiname (Class File)
* @return String mit voll qualifiziertem Klassennamen
* @throws ClassFormatError falls Name nicht ermittelbar (nicht ladbar)
* @throws FileNotFoundException
* @throws IOException
*/
public static String getNameFromClassFile(String sFileName) throws FileNotFoundException, IOException {
FileInputStream fis = null;
BufferedInputStream bis = null;
String sName = null;
try {
fis = new FileInputStream(sFileName);
bis = new BufferedInputStream(fis);
int size = 0;
int iLastRead = 0;
ByteArrayOutputStream bos = null;
if (bis != null) {
byte[] buffer = new byte[10000];
try {
bos = new ByteArrayOutputStream(30000);
while (iLastRead > -1) {
iLastRead = bis.read(buffer, 0, 10000);
if (iLastRead > -1) {
size = size + iLastRead;
bos.write(buffer, 0, iLastRead);
}
}
buffer = bos.toByteArray();
} finally {
if (bos != null) {
try {
bos.close();
} catch (Throwable t) {
}
}
}
class UglyLoader extends ClassLoader { //so baut man normaler weise keinen ClassLoader ;-)
public Class defineClassNow(byte[] b, int off, int len) throws ClassFormatError {
// Man beachte, dass durch das erste null verhindert wird, dass
// irgendwelche Prüfungen bzgl. Namen oder Package vorgenommen werden
return defineClass(null, b, off, len);
}
}
UglyLoader ul = new UglyLoader();
Class cl = ul.defineClassNow(buffer, 0, buffer.length);
sName = cl.getName();
}
}
finally {
try {
fis.close();
}
catch (Throwable t) {}
}
if (sName == null) {
throw new ClassFormatError("Name konnte nicht ermittelt werden.");
}
return sName;
}