Да, вы читаете самое большее число байтов, равное количеству символов в имени файла.Вместо этого вам нужно прочитать весь файл.Вот один из методов, использующий readFully, как вы предложили.
File f = new File("bin/" + className.replace('.', File.separatorChar) + ".class");
DataInputStream is = new DataInputStream(new FileInputStream(f));
int len = (int)f.length();
byte[] buff = new byte[len];
is.readFully(buff);
is.close();
return buff;
Поскольку вы не обрабатываете встроенные классы, такие как Object, я думаю, что вам нужно перехватить FileNotFoundException из loadClassData в вашем findClass, затемвызовите super.findClass.Например:
try {
try {
b = loadClassData(className);
}
catch(FileNotFoundException fnf) {
return super.findClass(className);
}
Class c = defineClass(className, b, 0, b.length);
if(c != null)
return c;
return super.findClass(className);
} catch (IOException e) {
e.printStackTrace();
}
return null;