国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從JVM中dump出動態代理生成的class

sherlock221 / 1625人閱讀

摘要:方案一設置運行環境變量運行后會把文件生成在目錄下動態代理時生成文件缺點是只適用于動態代理方案二使用可以出中所有已加載的。

由于動態代理生成的class是直接以二進制的方式加載進內存中的,并沒有對應的.class文件生成,所以如果想通過反編譯工具查看動態代理生成的代碼需要通過特殊的手段來處理。

方案一

設置運行環境變量,運行后會把class文件生成在classpath目錄下

//動態代理時生成class文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");

缺點是只適用于JDK動態代理

方案二

使用ClassDump,可以dump出JVM中所有已加載的class。ClassDump位于$JAVA_HOME/lib/sa-jdi.jar中(注:windows版本JDK從1.7開始才有此工具),直接以命令行執行。

#查看PID
E:workTestin>jps

#缺省輸出該PID下所有已加載的class文件至./目錄
E:workTestin>java -classpath ".;./bin;%JAVA_HOME%/lib/sa-jdi.jar" sun.jvm.hotspot.tools.jcore.ClassDump 
//導入sa-jdi.jar包,實現ClassFilter接口,只輸出匹配的class文件
public class MyFilter implements ClassFilter{

    @Override
    public boolean canInclude(InstanceKlass arg0) {
        return arg0.getName().asString().startsWith("com/sun/proxy/$Proxy0");
    }
    
}
#查看PID
E:workTestin>jps

#使用ClassFilter輸出匹配的class文件,并指定輸出目錄
E:workTestin>java -classpath ".;./bin;%JAVA_HOME%/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=proxy.MyFilter -Dsun.jvm.hotspot.tools.jcore.outputDir=e:/dump sun.jvm.hotspot.tools.jcore.ClassDump 

此方案基于JVM層的ClassDump所以可以支持javassist、cglib、asm動態生成的class。

最后貼下JDK動態代理反編譯出來的代碼
package com.sun.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import proxy.Run;    //目標代理類接口

//繼承了Proxy類,實現目標代理類接口
public final class $Proxy0
  extends Proxy
  implements Run
{
  private static Method m1;
  private static Method m3;
  private static Method m0;
  private static Method m2;
  
  public $Proxy0(InvocationHandler paramInvocationHandler)
  {
    super(paramInvocationHandler);
  }
  
  static
  {
    try
    {
      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
      //獲取目標代理類的方法
      m3 = Class.forName("proxy.Run").getMethod("run", new Class[0]);
      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
      return;
    }
    catch (NoSuchMethodException localNoSuchMethodException)
    {
      throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
    }
    catch (ClassNotFoundException localClassNotFoundException)
    {
      throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
    }
  }
  
  //方法重寫
  public final String run()
  {
    try
    {
      //this.h就是InvocationHandler的實現類了,調用invoke方法,在實現類里面做攔截處理
      return (String)this.h.invoke(this, m3, null);
    }
    catch (Error|RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
    {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }
  
  public final boolean equals(Object paramObject)
  {
    try
    {
      return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();
    }
    catch (Error|RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
    {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }
  
  public final String toString()
  {
    try
    {
      return (String)this.h.invoke(this, m2, null);
    }
    catch (Error|RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
    {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }
  
  public final int hashCode()
  {
    try
    {
      return ((Integer)this.h.invoke(this, m0, null)).intValue();
    }
    catch (Error|RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
    {
      throw new UndeclaredThrowableException(localThrowable);
    }
  }
}
參考

http://rednaxelafx.iteye.com/blog/727938

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67807.html

相關文章

  • 由「Metaspace容量不足觸發CMS GC」而引發思考

    摘要:第一個大陡坡是應用發布,老年代內存占比下降,很正常。但此時老年代內存使用占比。因為后期并不會引發??梢钥闯?,由于到達時候,觸發了一次和一次。但觸發時,占比并沒用明顯的規律。得出,擴容導致這個說法,其實是不準確的。 轉載請注明原文鏈接:https://www.jianshu.com/p/468... 某天早上,毛老師在群里問「cat 上怎么看 gc」。 showImg(https://...

    StonePanda 評論0 收藏0
  • jvm調優-命令篇

    摘要:打印等待回收對象的信息可以看到當前隊列中并沒有等待線程執行方法的對象。一般情況,會到客戶端用工具來分析用于生成虛擬機當前時刻的線程快照。 運用jvm自帶的命令可以方便的在生產監控和打印堆棧的日志信息幫忙我們來定位問題!雖然jvm調優成熟的工具已經有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生產環境出現問題的時候,一方面工具的使...

    Lsnsh 評論0 收藏0
  • Javag工程師成神之路(2019正式版)

    摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...

    Olivia 評論0 收藏0
  • 《深入理解Java虛擬機》(四)虛擬機性能監控與故障處理工具

    摘要:虛擬機性能監控與故障處理工具詳解概述本文參考的是周志明的深入理解虛擬機第四章,為了整理思路,簡單記錄一下,方便后期查閱。虛擬機堆轉儲快照分析工具功能用于分析生成的。 虛擬機性能監控與故障處理工具 詳解 4.1 概述 本文參考的是周志明的 《深入理解Java虛擬機》 第四章 ,為了整理思路,簡單記錄一下,方便后期查閱。 JDK本身提供了很多方便的JVM性能調優監控工具,除了集成式的Vis...

    gself 評論0 收藏0
  • Java開發 大廠面試整理

    摘要:用戶態不能干擾內核態所以指令就有兩種特權指令和非特權指令不同的狀態對應不同的指令。非特權指令所有程序均可直接使用。用戶態常態目態執行非特權指令。 這是我今年從三月份開始,主要的大廠面試經過,有些企業面試的還沒來得及整理,可能有些沒有帶答案就發出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助! 面試清單 平安產險 飛豬 上汽大通 浩鯨科...

    Scorpion 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<