java.lang.ClassFormatError: Extra bytes at the end of class file quartz/loader/MyCalcSalary
阿新 • • 發佈:2021-10-25
今天學習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代替,說明這個值實際上無關緊要。