查看jar java版本_查看Class文件或JAR文件编译JDK版本

【实例简介】

直接将class文件或jar文件拖动到text中,可以显示编译的jdk版本

【实例截图】

d92b54ca540a3177c28c47498d223d86.png

【核心代码】

import java.awt.Toolkit;

import java.awt.datatransfer.DataFlavor;

import java.awt.datatransfer.Transferable;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.Enumeration;

import java.util.jar.JarEntry;

import java.util.jar.JarFile;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JTextArea;

import javax.swing.TransferHandler;

/*

J2SE 8 = 52,

J2SE 7 = 51,

J2SE 6.0 = 50,

J2SE 5.0 = 49,

JDK 1.4 = 48,

JDK 1.3 = 47,

JDK 1.2 = 46,

JDK 1.1 = 45

*/

public class ClassVersion extends JFrame {

private JTextArea field;

public static void main(String[] args) {

new ClassVersion().showFrame();

}

private void showFrame() {

int width = 800;

int height = 600;

this.setTitle("查看class版本");

this.setSize(width, height);

// this.setLocationRelativeTo(null);

// this.setLayout(null);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Toolkit toolkit = Toolkit.getDefaultToolkit();

int x = (int) (toolkit.getScreenSize().getWidth() - this.getWidth()) / 2;

int y = (int) (toolkit.getScreenSize().getHeight() - this.getHeight()) / 2;

this.setLocation(x, y);

field = new JTextArea();

field.setBounds(50, 50, width, height);

// field.setHorizontalAlignment(JTextField.);

field.setTransferHandler(new TransferHandler() {

@Override

public boolean importData(JComponent comp, Transferable t) {

try {

Object o = t.getTransferData(DataFlavor.javaFileListFlavor);

String filepath = o.toString();

if (filepath.startsWith("[")) {

filepath = filepath.substring(1);

}

if (filepath.endsWith("]")) {

filepath = filepath.substring(0, filepath.length() - 1);

}

System.out.println(filepath);

if (filepath.endsWith("jar")) {

StringBuffer sb = new StringBuffer(filepath);

sb.append(":\r\n");

JarFile jar = new JarFile(filepath);

for (Enumeration enumJar = jar.entries(); enumJar.hasMoreElements();) {

JarEntry je = (JarEntry) enumJar.nextElement();

if (je.getName().endsWith(".class")) {

InputStream input = jar.getInputStream(je);

sb.append(je.getName()).append(":").append(checkClassVersion(input)).append("\r\n");

}

}

field.setText(sb.toString());

} else {

if (filepath.endsWith("class")) {

filepath = filepath ":" checkClassVersion(new File(filepath));

}

field.setText(filepath);

}

return true;

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

@Override

public boolean canImport(JComponent comp, DataFlavor[] flavors) {

for (int i = 0; i < flavors.length; i ) {

if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {

return true;

}

}

return false;

}

});

this.add(field);

this.setVisible(true);

}

public static String checkClassVersion(InputStream in) throws Exception {

byte[] data = new byte[8];

// 读取文件前8字节

// 实际上版本号写在第4-7字节上(从第0字节开始算)

in.read(data, 0, 8);

in.close();

// 计算出class文件的主次版本号

int minor_version = (((int) data[4]) << 8) data[5];

int major_version = (((int) data[6]) << 8) data[7];

return translateVersionToJDK(major_version);

}

/**

* 检查class文件的版本号

*

* @param classFile

* @return 返回值为:JDK1.4 JDK1.5 ... 或者unknown

* @throws Exception

*/

public static String checkClassVersion(File classFile) throws Exception {

FileInputStream in = new FileInputStream(classFile);

return checkClassVersion(in);

}

/**

* 根据主版本号,转换成JDK版本 48是JDK1.4,49是JDK1.5,依次类推

*

* @param major_version

* @return

*/

public static String translateVersionToJDK(final int major_version) {

switch (major_version) {

case 45:

return "JDK1.1";

case 46:

return "JDK1.2";

case 47:

return "JDK1.1";

case 48:

return "JDK1.4";

case 49:

return "JDK1.5";

case 50:

return "JDK1.6";

case 51:

return "JDK1.7";

case 52:

return "JDK1.8";

default:

return "unknown";

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值