首页 > 编程语言 >检查java的class文件版本

检查java的class文件版本

时间:2023-04-21 10:46:18浏览次数:38  
标签:java 版本 return file dirPath sb class append

 

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CheckClassVersion {
    public static void main(String[] args) {
        checkFilesInDir("D:/test", JDKVERSION.JDK8);
    }

    private static Map<Integer, String> map = new HashMap<Integer, String>(30);
    static {
        JDKVERSION[] values = JDKVERSION.values();
        for (JDKVERSION val : values) {
            map.put(val.getValue(), val.getName());
        }
    }
    
    /**
     * 检查文件夹中class文件版本号
     * @param dirPath
     * @param jdkVersion
     */
    public static void checkFilesInDir(String dirPath, JDKVERSION jdkVersion) {
        if (dirPath == null) {
            System.out.println("传入路径为空。");
            return;
        }
        if (dirPath.endsWith("\\")) {
            dirPath = dirPath.replaceAll("\\", "/");
        }

        File path = new File(dirPath);
        if (!path.exists()) {
            System.out.println(dirPath + "路径不存在。");
            return;
        }

        File[] files = path.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                getNames(file, file.getPath(), jdkVersion);
            }
        }
    }

    /**
     * 检查单个class文件版本
     * 
     * @param file
     * @param checkVersion
     * @return true:版本相同;false:版本不同
     */
    public static boolean check(String file, JDKVERSION jdkVersion) {
        if (!file.endsWith(".class")) {
            System.out.println(file + " 非class文件");
            return false;
        }
        FileInputStream fis = null;
        byte[] b = null;
        try {
            fis = new FileInputStream(file);
            b = new byte[8];
            try {
                int read = fis.read(b, 0, 8);
                if (read != 8) {
                    System.out.println(" 文件读取错误");
                    return false;
                }

                int fileVersion = parseFile(b);

                StringBuffer sb = new StringBuffer();
                sb.append(file);
                sb.append(" jdk版本:");
                sb.append(map.get(fileVersion));
                System.out.println(sb.toString());

                if (jdkVersion.getValue() == fileVersion) {
                    return true;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (b != null) {
                b = null;
            }
        }

        return false;
    }

    /**
     * 返回主版本号
     * 
     * @param data
     * @return
     */
    private static int parseFile(byte[] data) {
        StringBuffer sb = new StringBuffer();
        sb.append("魔数(magic):0x");
        sb.append(Integer.toHexString(data[0]).substring(6).toUpperCase());
        sb.append(Integer.toHexString(data[1]).substring(6).toUpperCase());
        sb.append(Integer.toHexString(data[2]).substring(6).toUpperCase());
        sb.append(Integer.toHexString(data[3]).substring(6).toUpperCase());
        sb.append(" 版本号(version):");
        int minor_version = (((int)data[4]) << 8) + data[5];// 次版本号
        int major_version = (((int)data[6]) << 8) + data[7];// 主版本号
        sb.append(major_version);
        sb.append(".");
        sb.append(minor_version);
        // System.out.println(sb.toString());

        return major_version;
    }

    private static void getNames(File file, String parentName, JDKVERSION jdkVersion) {
        if (file == null) {
            return;
        }

        if (file.isDirectory()) {
            String pathName = file.getPath();
            File[] files = file.listFiles();
            if (files == null || files.length == 0) {
                return;
            }
            for (File f : files) {
                getNames(f, pathName, jdkVersion);
            }
        } else if (file.isFile()) {
            String fileName = file.getPath();

            boolean flag = check(fileName, jdkVersion);
            if (!flag) {
                System.out.println(fileName + " 校验版本未通过,传入参数中预期的版本号是:" + jdkVersion);
            }
        }
        return;
    }

}

/**
 * jdk版本号
 * 
 * @author jinzhm
 *
 */
enum JDKVERSION {
    JDK1(45, "JDK1"), JDK2(46, "JDK2"), JDK3(47, "JDK3"), JDK4(48, "JDK4"), JDK5(49, "JDK5"), JDK6(50, "JDK6"), JDK7(
        51, "JDK7"), JDK8(52, "JDK8"), JDK9(53, "JDK9"), JDK10(54, "JDK10"), JDK11(55, "JDK11"), JDK12(56, "JDK12"),
    JDK13(57, "JDK13"), JDK14(58, "JDK14"), JDK15(59, "JDK15"), JDK16(60, "JDK16"), JDK17(61, "JDK17");

    private int value;
    private String name;

    private JDKVERSION(int value, String name) {
        this.value = value;
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public String getName() {
        return name;
    }
}

 

标签:java,版本,return,file,dirPath,sb,class,append
From: https://www.cnblogs.com/jinzhiming/p/17339506.html

相关文章

  • java堆栈方法区
    原文地址zhuanlan.zhihu.comjava堆栈方法区残枫cps​目录收起栈区堆区方法区栈区栈区描述的是方法执行的内存模型。每个方法在执行时都会创建一个栈帧(存放存储局部变量、操作数栈、动态链接、方法出口等)JVM为每个线程创建一个栈,栈属于线程私有,不能实现线程间的共享!用......
  • JavaScript 测试及效验工具
    JavaScript是一款强大的广泛运用于现代Web站点及应用的脚本语言。作为一个技艺精湛的Web开发者,掌握JavaScript可以增强用户的使用体验,提供交互及富客户端等功能。尽管JavaScript的语法非常简单,但对于写程序而言仍然是困难重重,就是因为它的运行环境:基于Web浏览器。以下您可以看......
  • mac安装并配置nexus3.5.1版本
    一、安装nexus前置条件:已经安装了JDK1:下载nexus(http://www.sonatype.com/download-oss-sonatype)最新版本(我的是3.5.1).2:解压下载文件,我的放在了/Users/xxx/myApp下3:配置环境变量:打开/etc目录,在profile文件中加入:NEXUS_HOME="/Users/xxx/myApp/nexus-3.5.1-02-mac/nexus-......
  • Java技术_基础技术(0003)_类执行顺序详解+实例(阿里面试题)+详细讲解+流程图
    一、总体原则列出执行顺序的原则(这里本人出了简化,比较明了。可能有漏的,请帮忙补充,但应付该实例足以):  ==父类先于子类;  ==静态先于非静态;  ==变量和块先于构造方法;  ==变量声明先于执行(变量赋值、块执行);(这一点是根据数据在内存中是如何存储的得出的,基本类型、对象、......
  • java调用python脚本,用到tensorflow、keras等第三方库
    https://blog.csdn.net/jstlovely/article/details/121247764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168110434116800227452800%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168110434116800227452800&......
  • 【Java基础】day16
    day16一、switch-case和if-else谁更快?switch-case在switch-case中,case的值是连续的话,会生成一个TableSwitch来进行优化,这样的情况下,只需要在表中进行判断即可。这里使用0-4的连续值来进行测试如果说多加几个Case的值,但是范围控制在比较小的范围时:这里使用0......
  • Java:谈谈线程池的使用?
    简介线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。核心参数1、核心线程数2、最大线程数3、空闲线程最大存活时间4、时间单位5、线程等待队列5、线程工厂......
  • Xshell 7 要继续使用此程序,您必须应用最新的更新或使用新版本
    一、遇到问题今天用Xshell7的时候,突然弹窗提示“要继续使用此程序,您必须应用最新的更新或使用新版本”点击确定后,过一会提示“已更新到最新版本”但是就是打不开Xshell7,没办法就只能上官网重新下载一个二、解决问题官网:https://www.xshell.com/zh/free-for-home-school/填写姓名......
  • JavaScript学习
    JS中的注释学习一个语言,先学习一个语言的注释,因为注释是给我们自己看的,也是给开发人员看的写好一个注释,有利于我们以后阅读代码5-1单行注释一般就是用来描述下面一行代码的作用可以直接写两个/,也可以按ctrl+///我是一个单行注释//下面代码表示在浏览器里面出现一个弹出......
  • JavaScript学习笔记
    SassSASS官网世界上最成熟、最稳定、最强大的专业级CSS扩展语言!sass是一个css的预编译工具也就是能够更优雅的书写csssass写出来的东西浏览器不认识依旧是要转换成css在浏览器中运行变量定义一个变量,在后面的代码中使用使用$来定义变量//定义一个$c作为变量,值是红......