標籤:agent、proxy
$Proxy該類是動態產生的,在啟動並執行時候產生。具體原始碼的提取參考的是:http://www.cnblogs.com/ctgulong/p/5011614.html?utm_source=tuicool&utm_medium=referral的blog
2.根據上面部落格的內容詳細寫一下產生原始碼的過程。參考之前的項目http://yinyueml.blog.51cto.com/4841237/1876473
1)首先需要一個agent的產生類。javaagent主要功能如下:
2)代碼如下
package jdkReview;import java.io.File;import java.io.FileOutputStream;import java.lang.instrument.ClassFileTransformer;import java.lang.instrument.IllegalClassFormatException;import java.lang.instrument.Instrumentation;import java.security.ProtectionDomain;public class CustomAgent implements ClassFileTransformer { // public static void premain(String agentArgs, Instrumentation inst) { inst.addTransformer(new CustomAgent()); } @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (!className.startsWith("java") && !className.startsWith("sun")) { // 既不是java也不是sun開頭的 // 匯出代碼 int lastIndexOf = className.lastIndexOf("/") + 1; String fileName = className.substring(lastIndexOf) + ".class"; exportClazzToFile("D:/javacode/", fileName, classfileBuffer); System.out.println(className + " --> EXPORTED Succeess!"); } return classfileBuffer; } /** * * @param dirPath *目錄以/結尾,且必須存在 * @param fileName * @param data */ private void exportClazzToFile(String dirPath, String fileName, byte[] data) { try { File file = new File(dirPath + fileName); if (!file.exists()) { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); } catch (Exception e) { System.out.println("exception occured while doing some file operation"); e.printStackTrace(); } }}
3)將CustomAgent匯出為jar包,並且修改MANIFEST.MF檔案內容如下:
Manifest-Version: 1.0Premain-Class: jdkReview.CustomAgent
該配置主要是為了Premain-Class的作用就是表示帶有premain靜態方法的Class。
4)在運行使用java動態代理的Client類的時候加上jvm的參數
-javaagent:d:/customAgent.jar
然後運行後如下結果為:
proxyPattern/Client --> EXPORTED Succeess!proxyPattern/GamePlayer --> EXPORTED Succeess!proxyPattern/IGamePlayer --> EXPORTED Succeess!proxyPattern/GamePlayIH --> EXPORTED Succeess!com/sun/proxy/$Proxy0 --> EXPORTED Succeess!有人再用我的帳號登陸登陸使用者名稱:yinyueml;玩家:張三上線張三正在打怪。張三升級了
現在通過
exportClazzToFile("D:/javacode/", fileName, classfileBuffer);
中的配置路勁就可以找到$Proxy0.class的檔案。
5)通過jad.exe反編譯應用對$Proxy0.class進行反編譯就可以擷取到原始碼。
java動態代理產生$Proxy0原始碼的操作