【实例简介】
直接将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";
}
}
}