基本信息
源码名称:查看Class文件或JAR文件编译JDK版本
源码大小:1.68KB
文件格式:.rar
开发语言:Java
更新时间:2017-12-28
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

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



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";
		}
	}

}