Class文件版本随意看

来源:互联网 发布:ubuntu 安装povray 编辑:程序博客网 时间:2024/06/07 06:55

转载请注明出处:http://blog.csdn.net/sunyujia/

最近一直在忙工作,工作之余打psp,很久不打理博客了,前天想查一个class文件的编译版本,感觉很麻烦,需要看16进制,于是昨天晚上写了个小工具,就几行代码,没什么研究价值,贴出来主要是为了方便大家使用.以后就不用看16进制了.

全部版本号请看 http://blog.csdn.net/sunyujia/archive/2008/01/06/2027399.aspx

 

本程序下载地址

http://download.csdn.net/source/841562

 

使用图示:

源码如下:

  1. package com.syj;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. /**
  6.  * <p>
  7.  * Title: Class文件解析器
  8.  * </p>
  9.  *
  10.  * <p>
  11.  * Copyright: 转载请注明出处http://blog.csdn.net/sunyujia/
  12.  * </p>
  13.  *
  14.  * @author 孙钰佳
  15.  * @main sunyujia@yahoo.cn
  16.  * @date Dec 4, 2008 9:27:10 PM
  17.  */
  18. public class ClassFileParser {
  19.     /**
  20.      *
  21.      * Description:解析类文件主要方法
  22.      *
  23.      * @param file
  24.      * @return
  25.      * @throws IOException
  26.      * @mail sunyujia@yahoo.cn
  27.      * @since:Dec 4, 2008 9:31:41 PM
  28.      */
  29.     public static ClassInfo parse(File file) throws IOException {
  30.         FileInputStream fis = null;
  31.         byte[] rs = null;
  32.         try {
  33.             fis = new FileInputStream(file);
  34.             rs = new byte[8];
  35.             fis.read(rs);
  36.         } finally {
  37.             if (fis != null)
  38.                 fis.close();
  39.         }
  40.         // System.out.println("Class文件前8字节: " + byte2HexString(rs));
  41.         ClassInfo classInfo = new ClassInfo();
  42.         classInfo.setMajorVersion(Integer.parseInt(
  43.                 byte2HexString(new byte[] { rs[7] }), 16));
  44.         classInfo.setMinorVersion(Integer.parseInt(
  45.                 byte2HexString(new byte[] { rs[5] }), 16));
  46.         classInfo.setFilePath(file.getAbsolutePath());
  47.         classInfo.setDevVersion(getDevVersion(classInfo.getMajorVersion()));
  48.         return classInfo;
  49.     }
  50.     /**
  51.      *
  52.      * Description:byte数组转化为十六进制
  53.      *
  54.      * @param b
  55.      * @return
  56.      * @mail sunyujia@yahoo.cn
  57.      * @since:Dec 4, 2008 10:47:31 PM
  58.      */
  59.     public static String byte2HexString(byte[] b) {
  60.         StringBuffer sb = new StringBuffer();
  61.         for (int i = 0; i < b.length; i++) {
  62.             String hex = Integer.toHexString(b[i] & 0xFF);
  63.             if (hex.length() == 1) {
  64.                 hex = '0' + hex;
  65.             }
  66.             sb.append(hex.toUpperCase());
  67.         }
  68.         return sb.toString();
  69.     }
  70.     /**
  71.      *
  72.      * Description:根据major主版本号计算开发主版本号
  73.      *
  74.      * @param m
  75.      * @return
  76.      * @mail sunyujia@yahoo.cn
  77.      * @since:Dec 4, 2008 10:48:29 PM
  78.      */
  79.     public static String getDevVersion(int m) {
  80.         int major = 45;
  81.         int devVersion = 1;
  82.         return String.valueOf(devVersion + ((m - major + 1) / 10f));
  83.     }
  84. }
  1. package com.syj;
  2. public class ClassInfo {
  3.     /**
  4.      * 主版本号
  5.      */
  6.     private int majorVersion;
  7.     /**
  8.      * 次版本号
  9.      */
  10.     private int minorVersion;
  11.     /**
  12.      * class文件路径
  13.      */
  14.     private String filePath;
  15.     /**
  16.      * 开发版本
  17.      */
  18.     private String devVersion;
  19.     public int getMajorVersion() {
  20.         return majorVersion;
  21.     }
  22.     public void setMajorVersion(int majorVersion) {
  23.         this.majorVersion = majorVersion;
  24.     }
  25.     public int getMinorVersion() {
  26.         return minorVersion;
  27.     }
  28.     public void setMinorVersion(int minorVersion) {
  29.         this.minorVersion = minorVersion;
  30.     }
  31.     public String getFilePath() {
  32.         return filePath;
  33.     }
  34.     public void setFilePath(String filePath) {
  35.         this.filePath = filePath;
  36.     }
  37.     public String toString() {
  38.         return "major.minor: " + majorVersion + "." + minorVersion + " 开发版本: "
  39.                 + devVersion;
  40.     }
  41.     public String getDevVersion() {
  42.         return devVersion;
  43.     }
  44.     public void setDevVersion(String devVersion) {
  45.         this.devVersion = devVersion;
  46.     }
  47. }
  1. package com.syj;
  2. import java.io.File;
  3. /**
  4.  * <p>
  5.  * Title: 查看class文件版本程序入口
  6.  * </p>
  7.  * <p>
  8.  * Copyright: 转载请注明出处http://blog.csdn.net/sunyujia/
  9.  * </p>
  10.  *
  11.  * @author 孙钰佳
  12.  * @main sunyujia@yahoo.cn
  13.  * @date Dec 4, 2008 9:26:39 PM
  14.  */
  15. public class Runner {
  16.     public static void main(String[] args) throws Exception {
  17.         if (args == null || args.length == 0) {
  18.             System.out.println("没有指定文件");
  19.         } else {
  20.             ClassInfo classInfo = ClassFileParser.parse(new File(args[0]));
  21.             System.out.println(classInfo);
  22.         }
  23.     }
  24. }

启动程序批处理源码:

  1. @echo off
  2. mode con: cols=110 lines=15
  3. :index
  4. color 27
  5. cls
  6. echo.
  7. echo     欢迎使用查看class文件版本小工具
  8. echo     我的博客:http://blog.csdn.net/sunyujia/
  9. echo     将class文件拖拽到此窗口后,点击窗口后敲回车.即可显示编译目标class文件的jdk版本
  10. echo.
  11. echo.
  12. set route=%cd%
  13. set ravel=
  14. set /p ravel=    请拖入要查看的class文件:
  15. set "ravel=%ravel:"=%"
  16. if /i "%ravel:~-6%"==".classif exist "%ravel%" goto go
  17. cls
  18. echo 文件错误,指定文件不存在或不是class文件!
  19. echo 按任意键重新输入... 
  20. echo.
  21. echo.
  22. echo 按任意键重新输入...
  23. pause >nul
  24. goto index
  25. :go
  26. java -jar  VersionViewer.jar %ravel%
  27. echo.
  28. echo 按任意键退出...
  29. pause >nul
  30. exit
原创粉丝点击