• 修改Java标准库源码


    以下是摘抄,实际操作没有测试
     
    先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Class object(而是由class loader负责生成),因此“在ctor中打印出某种信息”的企图也就失去了意义。
    这里我要谈点题外话:如何修改Java标准库源码并让它反应到我们的应用程序来。假设我想修改java.lang.Class,让它在某些情况下打印某种信息。首先必须找出标准源码!当你下载JDK 套件并安装妥当,你会发现jdk150srcjavalang 目录(见图10)之中有Class.java,这就是我们此次行动的标准源码。备份后加以修改,编译获得Class.class。接下来准备将.class 搬移到jdk150jrelibendorsed(见图10)。
    这是一个十分特别的目录,class loader将优先从该处读取内含classes的.jar文件——成功的条件是.jar内的classes压缩路径必须和Java标准库的路径完全相同。为此,我们可以将刚才做出的Class.class先搬到一个为此目的而刻意做出来的javalang目录中,压缩为foo.zip(任意命名,唯需夹带路径javalang),再将这个foo.zip搬到jdk150jrelibendorsed并改名为foo.jar。此后你的应用程序便会优先用上这里的java.lang.Class。整个过程可写成一个批处理文件(batch file),如图11,在DOS Box中使用。
    图10:JDK1.5 安装后的目录组织。其中的endorsed 是我新建。
    del e:javalang*.class //清理干净
    del c:jdk150jrelibendorsedfoo.jar //清理干净
    c:
    cd c:jdk150srcjavalang
    javac -Xlint:unchecked Class.java //编译源码
    javac -Xlint:unchecked ClassLoader.java //编译另一个源码(如有必要)
    move *.class e:javalang //搬移至刻意制造的目录中
    e:
    cd e:javalang //以下压缩至适当目录
    pkzipc -add -path=root c:jdk150jrelibendorsedfoo.jar *.class
    cd e: est //进入测试目录
    javac -Xlint:unchecked Test.java //编译测试程序
    java Test //执行测试程序
    图11:一个可在DOS Box中使用的批处理文件(batch file),用以自动化java.lang.Class
    的修改动作。Pkzipc(.exe)是个命令列压缩工具,add和path都是其命令。
  • 相关阅读:
    提升应用崩溃时的用户体验——去掉烦人的“很抱歉”提示框
    Activity与DialogFragment交互的方法
    取之有道——巧用Root权限 启动其他APP中的Activity
    巧用Handler获取View控件信息
    关于遍历javascript 中的json串浏览器输出的结果不统一的情况
    PHP usort 函数底层排序
    IO多路复用小故事
    不知道写的是啥
    GC算法-增量式垃圾回收
    GC算法-分代垃圾回收
  • 原文地址:https://www.cnblogs.com/kobe8/p/3823783.html
Copyright © 2020-2023  润新知