• 【原创】Java基础之简单修改jar包中的class


    有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是:

    1 进入lib目录

    # cd lib
    # ls
    test.jar dependency1.jar dependency2.jar

    2 查看待修改jar包内类结构

    $ unzip -l test.jar
    
    or
    
    $ vim test.jar

    3 解压待修改jar包

    $ mkdir test_dir
    $ unzip test.jar -d test_dir

    4 查看class的jdk版本

    $ vi -b test_dir/package/Class.class
    :%!xxd
    
    0000000: cafe babe 0000 0032 0123 0700 0201 0023 .......2.#.....#

    取第15-16位,上例即32,

    5 将要修改的文件放到class同目录下(如果没有源代码可以尝试反编译),并修改

    $ vi test_dir/package/Class.java

    6 收集classpath

    由于jar包可能非常多,所以使用命令来生成

    $ ls *.jar|sed ':a;N;$!ba;s/
    /:/g'
    test.jar:dependency1.jar:dependency2.jar

    注linux下是:分隔,windows下是;分隔

    7 编译

    $ javac -help
    Usage: javac <options> <source files>
    where possible options include:
      -g                         Generate all debugging info
      -g:none                    Generate no debugging info
      -g:{lines,vars,source}     Generate only some debugging info
      -nowarn                    Generate no warnings
      -verbose                   Output messages about what the compiler is doing
      -deprecation               Output source locations where deprecated APIs are used
      -classpath <path>          Specify where to find user class files and annotation processors
      -cp <path>                 Specify where to find user class files and annotation processors
      -sourcepath <path>         Specify where to find input source files
      -bootclasspath <path>      Override location of bootstrap class files
      -extdirs <dirs>            Override location of installed extensions
      -endorseddirs <dirs>       Override location of endorsed standards path
      -proc:{none,only}          Control whether annotation processing and/or compilation is done.
      -processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
      -processorpath <path>      Specify where to find annotation processors
      -parameters                Generate metadata for reflection on method parameters
      -d <directory>             Specify where to place generated class files
      -s <directory>             Specify where to place generated source files
      -h <directory>             Specify where to place generated native header files
      -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
      -encoding <encoding>       Specify character encoding used by source files
      -source <release>          Provide source compatibility with specified release
      -target <release>          Generate class files for specific VM version
      -profile <profile>         Check that API used is available in the specified profile
      -version                   Version information
      -help                      Print a synopsis of standard options
      -Akey[=value]              Options to pass to annotation processors
      -X                         Print a synopsis of nonstandard options
      -J<flag>                   Pass <flag> directly to the runtime system
      -Werror                    Terminate compilation if warnings occur
      @<filename>                Read options and filenames from file

    实际命令

    $ javac -cp test.jar:dependency1.jar:dependency2.jar -source 1.6 -target 1.6 -sourcepath test_dir -d test_dir test_dir/package/Class.java

    8 重新打jar包

    $ cd test_dir
    $ zip -r test.jar ./*

    9 删除临时目录和原始jar

    $ cd ..
    $ cp test_dir/test.jar test.jar
    $ /bin/rm -rf test_dir

    10 测试修改生效

  • 相关阅读:
    可左右拖动窗口demo
    制作一个简单的百度网盘在线视频加速的chrome插件
    git分支
    使用git的ssh
    git的概念和常用命令
    爬虫:获取页面 -- request库的使用
    字符串方法
    从实现原理更深入了解call和apply
    Git和GitHub使用
    localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/barneywill/p/10552322.html
Copyright © 2020-2023  润新知