Agent agentmain-執行期恢復類修改,熱替換
阿新 • • 發佈:2018-11-28
前文講過執行期修改類,但是有的時候想去除以前的修改,比如曾經添加了類監控,但是現在不想監控了,希望恢復成原生程式碼。
使用以下程式碼,重新從原始碼檔案中讀取類資訊,然後載入到jvm中。
這既可以擦除原來的修改,也可以實現熱替換功能。 這裡只貼出了關鍵程式碼,其它部分和前文一致。
public class RestoreTransformer implements ClassFileTransformer { public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { try { if (className.contains(UdAgent.paths)); return readStream(ClassLoader.getSystemResourceAsStream(className.replace('.', '/') + ".class"), true); } catch (IOException e) { e.printStackTrace(); } return null; } private static byte[] readStream(InputStream inputStream, boolean close) throws IOException { if(inputStream == null) { throw new IOException("Class not found"); } else { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[4096]; int bytesRead; while((bytesRead = inputStream.read(data, 0, data.length)) != -1) { outputStream.write(data, 0, bytesRead); } outputStream.flush(); byte[] var5 = outputStream.toByteArray(); return var5; } finally { if(close) { inputStream.close(); } } } } }