实例介绍
【实例简介】
直接将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";
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论