<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0,  comments - 17,  trackbacks - 0

    JavaVM,反射與動態代理



    Java程序的工作機制:Java對象都以單獨的class文件存在,java虛擬機將其載入并執行其虛擬機指令。



    Java虛擬機查找這些java對象:

    java虛擬機根據class path來查找java對象,而虛擬機的class path又分為三層:

    bootstrap:sun.boot.class.path

    extension: java.ext.dirs

    application: java.class.path

    三個class path各有對應的classloader。由上而下形成父子關系

    當程序中調用new指令,或者ClassLoader.load方法時。其順序如下:

    1. 首先查看application的classloader中是否已有對應的class緩存,如果有則返回,并根據class分配內存。如果沒有,接下一步。

    2. 首先查看extension的classloader中是否已有對應的class緩存,如果有則返回,并根據class分配內存。如果沒有,接下一步。

    3. 首先查看bootstrap的classloader中是否已有對應的class緩存,如果有則返回,并根據class分配內存。如果沒有,接下一步。

    4. 由bootstrap的classloader在其class path中試圖加載該class,如果有,則將該class放入cache中,并返回。如果沒有,接下一步。

    5. 由extension的classloader在其class path中試圖加載該class,如果有,則將該class放入cache中,并返回。如果沒有,接下一步。

    6. 由application的classloader在其class path中試圖加載該class,如果有,則將該class放入cache中,并返回。如果沒有,則拋出ClassNotFound的exception。



    Java虛擬機加載這些java對象:

    每個java虛擬機都在其啟動時產生一個唯一的class heap,并把所有的class instance都分配在其中。其中每個類實例的信息又分兩部分,fields域和methods域。每個類實例各自擁有fields,但同一個類的不同實例共享methods



    反射

    JVM對反射的處理

    簡單例子代碼:

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.InvocationTargetException;

    import java.io.IOException;



    public class Main {

    public static void main(String[] args){

    TempImpl t1 = new TempImpl("temp1");

    try {

    Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

    t1Talk.invoke(t1, null);

    } catch (NoSuchMethodException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    } catch (IllegalAccessException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    } catch (InvocationTargetException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    }

    try {

    System.in.read();

    } catch (IOException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    }

    }

    }


    復雜例子代碼:

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.InvocationTargetException;

    import java.io.IOException;



    public class Main {

    public static void main(String[] args){

    TempImpl t1 = new TempImpl("temp1");

    TempImpl t2 = new TempImpl("temp2");

    Temp2 temp2 = new Temp2();

    try {

    Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

    Method t2Talk = t2.getClass().getMethod("Talk", new Class[0]) ;

    t1Talk.invoke(t2, null);

    t2Talk.invoke(t1, null);

    if(t1Talk.equals(t2Talk)){

    System.out.println("equals");

    }

    else{

    System.out.println("not equals");

    }

    if(t1Talk==t2Talk){

    System.out.println("ref equals");

    }

    else{

    System.out.println("ref not equals");

    }

    t2Talk.invoke(temp2, null);

    } catch (NoSuchMethodException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    } catch (IllegalAccessException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    } catch (InvocationTargetException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    }

    try {

    System.in.read();

    } catch (IOException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    }

    }

    }




    分析:java虛擬機把每個methods當作一個執行單元。該執行單元帶有兩種簽名:類簽名和屬性簽名(public,static等)。 反射的第一步,驗證簽名的合法性。驗證通過后,順序執行該method中的指令,當需要訪問類實例的fields和傳入參數時,由虛擬機注入。



    動態代理

    Sun對動態代理的說明:

    一個簡單例子代碼:

    動態代理的內部實現——代碼生成:

    研究JDK源代碼,發現在Proxy的sun實現中調用了sun.misc.ProxyGenerator類的generateProxyClass( proxyName, interfaces)方法,其返回值為byte[]和class文件的內存類型一致。于是做如下試驗:

    public class ProxyClassFile{

    public static void main(String[] args){

    String proxyName = "TempProxy";

    TempImpl t = new TempImpl("proxy");

    Class[] interfaces =t.getClass().getInterfaces();



    byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

    proxyName, interfaces);

    File f = new File("classes/TempProxy.class");

    try {

    FileOutputStream fos = new FileOutputStream(f);

    fos.write(proxyClassFile);

    fos.flush();

    fos.close();

    } catch (FileNotFoundException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    } catch (IOException e) {

    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

    }

    }

    }


    運行該類,到class文件夾下,利用反編譯技術,發現原來其采用了代碼生產技術:



    public interface Temp{

    public void Talk();

    public void Run();

    }

    import java.lang.reflect.*;



    public final class TempProxy extends Proxy

    implements Temp{



    private static Method m4;

    private static Method m2;

    private static Method m0;

    private static Method m3;

    private static Method m1;



    public TempProxy(InvocationHandler invocationhandler) {

    super(invocationhandler);

    }



    public final void Run() {

    try {

    h.invoke(this, m4, null);

    return;

    }

    catch(Error _ex) { }

    catch(Throwable throwable) {

    throw new UndeclaredThrowableException(throwable);

    }

    }



    public final String toString(){

    try{

    return (String)h.invoke(this, m2, null);

    }

    catch(Error _ex) { }

    catch(Throwable throwable) {

    throw new UndeclaredThrowableException(throwable);

    }

    return "";

    }



    public final int hashCode() {

    try {

    return ((Integer)h.invoke(this, m0, null)).intValue();

    }

    catch(Error _ex) { }

    catch(Throwable throwable){

    throw new UndeclaredThrowableException(throwable);

    }

    return 123;

    }



    public final void Talk(){

    try{

    h.invoke(this, m3, null);

    return;

    }

    catch(Error _ex) { }

    catch(Throwable throwable) {

    throw new UndeclaredThrowableException(throwable);

    }

    }



    public final boolean equals(Object obj) {

    try {

    return ((Boolean)h.invoke(this, m1, new Object[] {

    obj

    })).booleanValue();

    }

    catch(Error _ex) { }

    catch(Throwable throwable) {

    throw new UndeclaredThrowableException(throwable);

    }

    return false;

    }



    static{

    try{

    m4 = Class.forName("Temp").getMethod("Run", new Class[0]);

    m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);

    m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);

    m3 = Class.forName("Temp").getMethod("Talk", new Class[0]);

    m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {

    Class.forName("java.lang.Object")

    });

    }

    catch(NoSuchMethodException nosuchmethodexception) {

    throw new NoSuchMethodError(nosuchmethodexception.getMessage());

    }

    catch(ClassNotFoundException classnotfoundexception) {

    throw new NoClassDefFoundError(classnotfoundexception.getMessage());

    }

    }


    posted on 2007-12-17 16:19 xyz 閱讀(294) 評論(0)  編輯  收藏 所屬分類: 網絡文摘

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿

    隨筆檔案(1)

    文章分類(44)

    文章檔案(46)

    收藏夾(1)

    Adobe

    AOP

    API

    appServer

    BI

    c

    • c-free
    • codeblocks
    • codelite
    • CodeLite IDE 是一個強大的開源,跨平臺的 C/C++整合開發環境. 支持包括 Windows、Linux 和 Mac 系統下運行
    • codelite官網
    • dev-c++
    • Dev-C++是一個C&C++開發工具,它是一款自由軟件,遵守GPL協議。
    • GCC
    • GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語言。

    Cache

    CMS

    DB

    eclipse

    FreeMarker

    hibernate

    html5

    ibatis

    java

    jquery

    js

    json

    Linux

    Log

    mail server

    mobile

    mysql

    oauth

    openID

    other

    PHP

    portal

    report

    Scheduler

    schema

    Security

    SOA

    spring

    struts

    UI原型設計

    w3c

    Wap

    webservice

    xml

    供應鏈管理

    博客鏈接

    好網站

    工作流

    開源網

    招聘

    插件下載

    操作系統

    構建可伸縮的系統

    構建工具

    測試

    • IETest
    • IE官網
    • OpenSTA
    • Siege
    • Siege是一個壓力測試和評測工具,設計用于WEB開發這評估應用在壓力下的承受能力

    游戲

    源碼托管

    經營

    資源

    金融/財務

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 本道天堂成在人线av无码免费| aⅴ在线免费观看| 久久综合亚洲色一区二区三区| 国产美女在线精品免费观看| 免费国产va在线观看| 亚洲国产精品人久久| 好吊妞在线成人免费| 91视频免费观看高清观看完整| 亚洲欧洲自拍拍偷综合| 免费一级毛片清高播放| 少妇无码一区二区三区免费| 亚洲人AV在线无码影院观看| 久久被窝电影亚洲爽爽爽| 成人免费毛片内射美女APP| 羞羞视频免费网站在线看| 亚洲av永久无码精品三区在线4| 亚洲精品久久久www| 4hu四虎最新免费地址| 中文字幕永久免费| 亚洲婷婷第一狠人综合精品| 久久亚洲国产成人影院网站| 日韩亚洲国产高清免费视频| 成人A毛片免费观看网站| 亚洲国产综合AV在线观看| 亚洲一区二区影院| 亚洲日韩中文字幕在线播放| 卡1卡2卡3卡4卡5免费视频| 91人人区免费区人人| a在线视频免费观看在线视频三区| 中文字幕亚洲男人的天堂网络| 亚洲日韩中文字幕在线播放| 国产在线观看免费视频播放器| 永久看日本大片免费35分钟| 一级a性色生活片久久无少妇一级婬片免费放 | 中文字幕无码成人免费视频| 中文在线免费观看| 国产精品亚洲二区在线| 亚洲日产乱码一二三区别| 亚洲国产美女精品久久| 亚洲激情中文字幕| 亚洲AV美女一区二区三区|