zoukankan      html  css  js  c++  java
  • 【原创】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 测试修改生效

  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/barneywill/p/10552322.html
Copyright © 2011-2022 走看看