1. 程式人生 > 其它 >java.lang.ClassFormatError: Extra bytes at the end of class file quartz/loader/MyCalcSalary

java.lang.ClassFormatError: Extra bytes at the end of class file quartz/loader/MyCalcSalary

今天學習ClassLoader的時候,參考視訊自己寫了個測試程式碼,報的這個錯。

我一直以為是呼叫defineClass傳入的第一個name引數的值有問題,或者是jar包中的檔案有package但是沒有將資料夾一起打包進入jar的問題。

然後重新看了下視訊,再驗證了猜想,沒發現問題的根本原因。結果還是直接搜報錯百度到了,讀取class檔案的時候多讀寫了位元組數。

原始碼:

@Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            String ur 
= "jar:file:\\D:/test/one/two.jar!/quartz/loader/" + name + ".class"; System.out.println(ur); URL url = new URL(ur); URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); ByteArrayBuffer byteArrayBuffer
= new ByteArrayBuffer(); byte[] bytes = new byte[1024]; while (inputStream.read(bytes) != -1) { byteArrayBuffer.write(bytes); } return defineClass("quartz.loader.MyCalcSalary", byteArrayBuffer.toByteArray(), 0, byteArrayBuffer.toByteArray().length); }
catch (Exception e) { e.printStackTrace(); } return null; }

修改後:

@Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            String ur = "jar:file:\\D:/test/one/two.jar!/quartz/loader/" + name + ".class";
            System.out.println(ur);
            URL url = new URL(ur);
            URLConnection urlConnection = url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();

            ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer();
            byte[] bytes = new byte[1024];
            int len;
            while ((len = inputStream.read(bytes)) != -1) {
                byteArrayBuffer.write(bytes, 0, len);
            }
            return defineClass(null, byteArrayBuffer.toByteArray(), 0, byteArrayBuffer.toByteArray().length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

問題是:byteArrayBuffer.write的時候出現問題了,和defineClass的第一個引數沒關係,因為jdk註釋中有說明:如果你不知道這個name的值,那麼你可以用null代替,說明這個值實際上無關緊要。