查看Java class文件版本的方法

合集下载

JavaScrit工具函数之获取浏览器类型和版本号

JavaScrit工具函数之获取浏览器类型和版本号

JavaScrit工具函数之获取浏览器类型和版本号获取浏览器类型和版本号是在Web开发过程中常见的需求之一。

JavaScript作为一门强大的编程语言,也提供了一些工具函数来满足这个需求。

本文将介绍几种常用的JavaScript工具函数,以及它们的使用方法和效果。

一、erAgenterAgent是JavaScript内置的一个属性,用于返回客户端浏览器的User-Agent字符串。

这个字符串中包含了浏览器名称、版本号以及操作系统等信息。

我们可以使用正则表达式来获取其中的浏览器信息。

代码示例:```javascriptvar userAgent = erAgent;var browser = {name: '',version: ''};if (/Opera/.test(userAgent)) { = 'Opera';browser.version =userAgent.match(/Opera\/[\d\.]+/)[0].replace('Opera/', '');} else if (/MSIE/.test(userAgent)) { = 'IE';browser.version = userAgent.match(/MSIE [\d\.]+/)[0].replace('MSIE ', '');} else if (/Firefox/.test(userAgent)) { = 'Firefox';browser.version =userAgent.match(/Firefox\/[\d\.]+/)[0].replace('Firefox/', '');} else if (/Chrome/.test(userAgent)) { = 'Chrome';browser.version =userAgent.match(/Chrome\/[\d\.]+/)[0].replace('Chrome/', '');} else if (/Safari/.test(userAgent)) { = 'Safari';browser.version =userAgent.match(/Version\/[\d\.]+/)[0].replace('Version/', '');} else { = 'Unknown';browser.version = 'Unknown';}console.log('Browser Name:', );console.log('Browser Version:', browser.version);```上述代码中,我们首先获取了userAgent字符串,然后通过一系列的正则表达式判断来确定浏览器的名称和版本号。

javatika文件类型判断方法及其实现

javatika文件类型判断方法及其实现

javatika文件类型判断方法及其实现Apache Tika是一个开源的Java工具包,用于从各种文档格式中提取内容,如文本、元数据和结构化数据等。

在Tika中,可以使用多种方式判断文件类型,包括文件扩展名、魔术字节和MIME类型等。

一、文件扩展名判断文件的扩展名是文件名的一部分,用于标识文件的类型。

在Tika中,可以通过文件的扩展名判断文件的类型。

Tika提供了一个方法用于获取文件的扩展名,即FilenameUtils.getExtension(方法。

以下是一个示例代码:```javapublic class FileUtilpublic static void main(String[] args)String fileName = "example.docx";String extension = FilenameUtils.getExtension(fileName);System.out.println("File extension: " + extension);//判断文件类型if (extension.equalsIgnoreCase("docx"))System.out.println("File type: Microsoft Word document");} else if (extension.equalsIgnoreCase("pdf"))System.out.println("File type: Portable Document Format");} else if (extension.equalsIgnoreCase("xlsx"))System.out.println("File type: Microsoft Excel spreadsheet");} elseSystem.out.println("File type: Unknown");}}```二、魔术字节判断文件的魔术字节是文件开头几个字节的特定值,用于标识文件的类型。

【黑马程序员】Java如何判断文件的真实类型

【黑马程序员】Java如何判断文件的真实类型

【黑马程序员】Java 如何判断文件的真实类型在我们实现一些需求的时候,有时候需要让用户上传文件,例如做论坛、社交类的应用和服务。

这时候可能就会出现一个需求:上传固定类型、固定大小的文件,也就是说,只允许用户上传图片或者文本、压缩包等。

其他的格式禁止上传,以防止用户恶意操作。

文件的大小非常容易判断,主要是文件类型如何确定。

有一种方式是按照扩展名去判断,例如图片就是.jpg 、.png 等,但是这种方式不准确,因为如果真是恶意上传,exe 文件也可以修改为xxx.jpg 上传成功。

所以,必须要用一种方式获取文件的真实类型。

即使文件后缀名修改了,也能找出来它的原形。

这个地方我们需要先了解一些基本知识,就是所有的文件的开头都有一段头信息,用来承担一定的任务,而每个不同类型的文件的头信息都是不同的,所以我们可以按照这种方式来进行判断。

首先,我们需要获取到文件头里这几个字节的数据,很简单,使用输入流来读取即可。

代码如下: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 public static String getFileHeader (String filePath ) {FileInputStream is = null;String value = null;try {is = new FileInputStream (filePath );byte[] b = new byte[4];is .read (b , 0, b.length );value = bytesToHexString (b );} catch (Exception e ) {} finally {if (null != is ) {try {is .close ();} catch (IOException e ) {}}}return value ;19 }这个地方很容易理解,就是把文件的前4个byte 取出来了,但是取出来的数据我们需要转换为16进制的字符串来表示,才能判断出来究竟是什么内容。

recognizes class file version

recognizes class file version

recognizes class file version全文共四篇示例,供读者参考第一篇示例:Java虚拟机(Java Virtual Machine)是一种能够执行Java字节码的虚拟机,是Java程序运行的基础。

Java虚拟机可以在任何支持Java的平台上运行,这为跨平台开发提供了便利。

在Java编程中,我们通常会编写Java源代码,然后通过编译器将其编译成字节码文件。

而Java虚拟机会加载并执行这些字节码文件。

在加载字节码文件时,Java虚拟机会检查字节码文件的版本号,以确保其能够正确解析和执行。

Java虚拟机对于不同版本的Java字节码文件都有对应的支持,因此当我们编写Java程序时,需要根据所使用的Java开发工具版本来选择合适的Java字节码版本。

Java虚拟机能够识别和支持的Java字节码版本可以通过java -version命令查看。

Java字节码文件的版本号主要由主版本号和次版本号组成,例如45.0、46.0、47.0等。

主版本号用于表明Java编译器的主要版本,而次版本号则表示该版本的修订号。

Java虚拟机会根据主版本号来确定其是否支持该版本的字节码文件,如果不支持,则会抛出UnsupportedClassVersionError异常。

在Java 8之后,主要的Java版本发布如下:- Java SE 8对应的主版本号是52,是Java 8发布的版本。

- Java SE 9对应的主版本号是53,是Java 9发布的版本。

- Java SE 10对应的主版本号是54,是Java 10发布的版本。

- Java SE 11对应的主版本号是55,是Java 11发布的版本。

- Java SE 12对应的主版本号是56,是Java 12发布的版本。

- Java SE 13对应的主版本号是57,是Java 13发布的版本。

- Java SE 14对应的主版本号是58,是Java 14发布的版本。

java获取文件类型的方法

java获取文件类型的方法

java获取文件类型的方法There are several methods to get the file type in Java. One commonly used method is to use the Java NIO package to read the file and extract the file type from the file's header. By reading the file header and identifying the file signature, it is possible to determine the file type. This method is reliable and widely used in many applications.在Java中有几种获取文件类型的方法。

一种常用的方法是使用Java NIO 包来读取文件,并从文件头中提取文件类型。

通过读取文件头并识别文件标识,可以确定文件类型。

这种方法在许多应用程序中是可靠和广泛使用的。

Another method to get the file type in Java is to use the URLConnection class to get the content type of the file from a URL. This method is useful when working with files that are hosted online and accessed through a URL. By using the URLConnection class, it is possible to retrieve the content type of the file and determine its type.在Java中获取文件类型的另一种方法是使用URLConnection类从URL获取文件的内容类型。

Class转储Dex的原理解析

Class转储Dex的原理解析
Runt ime Invi sibleAnnot at ions RuntimeVisibleAnnotations
Synthetic Signature SourceDebugExtension SourceFile
ConstantValue Deprecated
Runt ime Invi sibleAnnot at ions RuntimeVisibleAnnotations
Class 转储 Dex 的原理解析
导语:Dex 文件对于 Android 开发者来说并不陌生,其作用是充当一个 Android 应用的
可执行文件。Android 应用基于 Java 虚拟机(JVM),执行字节码,我们开发 Android 应用 也是通过 Java 语言,经过编译后生成 Class 文件,然后通过 Dex 最终打包到 Apk。那么, Class 文件是如何转储到 Dex 中的呢?基于 Android Gradle 的构建,本文首先简述了 Class 文件、Dex 文件的结构定义,说明二者在结构方面的联系,然后详细描述了 Android Gradle 转储 Class 到 Dex 的过程,最后,通过可视化编辑器打开 Dex 文件,让开发者真实查看 Dex 文件内容,深入 Dex 的世界。
从以上 Dex 文件格式定义来看,Dex 文件格式类似于 Class 文件格式,都存 储了 Java 的常量、类、方法、变量、字节码等,集成了 Class 文件紧密存储的 特性。不同之处在于,Dex 文件具有更高的存储量,更丰富的存储类型。那么 Dex 文件与 Class 文件到底是什么关系,以及如何生成 Dex 文件呢?以下小节给予详 细的说明。
interfaces_count
fielfields

linux获取文件版本号的方法

linux获取文件版本号的方法

在Linux系统中,获取文件版本号的方法有多种,以下是一些常见的方法:
1.使用lsb_release命令:该命令是Linux标准库支持项目(Linux Standard
Base)的一部分,用于提供有关Linux发行版的详细信息。

通过在终端中输入
lsb_release -a命令,可以查看发行版的名称、版本号和其他相关信息。

2.查看/etc/os-release文件:大多数Linux发行版在/etc目录下包含一个名为
os-release的文件,其中包含有关操作系统的详细信息。

您可以使用cat命令或其他文本编辑器查看该文件的内容,其中包含发行版的名称和版本号等详细信息。

3.查看/proc/version文件:该文件包含了Linux内核的版本信息。

使用cat命令
可以查看该文件的内容,其中包括Linux内核的版本号和其他相关信息。

4.使用uname命令:该命令用于显示有关系统的详细信息,包括内核版本。

要查看
发行版的名称和版本号,可以在终端中运行以下命令:uname -a。

5.查看文件名或文件内容:有些可执行文件或共享库在其文件名中包含了版本号
信息,例如以“.so”为扩展名的共享库文件通常会在文件名中包含版本号。

另外,一些
可执行文件或共享库会在其头部或特定位置包含版本号信息,可以使用诸如strings命令的工具来提取这些信息。

需要注意的是,这些方法可能适用于不同的Linux发行版和文件类型。

对于某些特定的软件或库,您可能需要查阅其文档或使用特定的工具来获取版本号信息。

java获取当然JDK版本信息

java获取当然JDK版本信息

java获取当然JDK版本信息使⽤spring下的JdkVersion.java⽂件获取当然jdk版本信息。

JdkVersion.java代码:package org.springframework.core; /** * Internal helper class used to find the Java/JVM version * that Spring is operating on, to allow for automatically * adapting to the present platform's capabilities. * * <p>Note that Spring requires JVM 1.5 or higher, as of Spring 3.0. * * @author Rod Johnson * @author Juergen Hoeller * @author Rick Evans */ public abstract class JdkVersion { /** * Constant identifying the 1.3.x JVM (JDK 1.3). */ public static final int JAVA_13 = 0; /** * Constant identifying the 1.4.x JVM (J2SE 1.4). */ public static final int JAVA_14 = 1; /** * Constant identifying the 1.5 JVM (Java 5). */ public static final int JAVA_15 = 2; /** * Constant identifying the 1.6 JVM (Java 6). */ public static final int JAVA_16 = 3; /** * Constant identifying the 1.7 JVM (Java 7). */ public static final int JAVA_17 = 4; private static final String javaVersion; private static final int majorJavaVersion; static { javaVersion = System.getProperty("java.version"); // version String should look like "1.4.2_10" if (javaVersion.contains("1.7.")) { majorJavaVersion = JAVA_17; } else if (javaVersion.contains("1.6.")) { majorJavaVersion = JAVA_16; } else { // else leave 1.5 as default (it's either 1.5 or unknown) majorJavaVersion = JAVA_15; } } /** * Return the full Java version string, as returned by * <code>System.getProperty("java.version")</code>. * @return the full Java version string * @see System#getProperty(String) */ public static String getJavaVersion() { return javaVersion; } /** * Get the major version code. This means we can do things like * <code>if (getMajorJavaVersion() < JAVA_14)</code>. *@return a code comparable to the JAVA_XX codes in this class * @see #JAVA_13 * @see #JAVA_14 * @see #JAVA_15 *@see #JAVA_16 * @see #JAVA_17 */ public static int getMajorJavaVersion() { return majorJavaVersion; } /** * Convenience method to determine if the current JVM is at least Java 1.4. * @return <code>true</code> if the current JVM is at least Java 1.4 * @deprecated as of Spring 3.0 which requires Java 1.5+ * @see #getMajorJavaVersion() * @see #JAVA_14 * @see#JAVA_15 * @see #JAVA_16 * @see #JAVA_17 */ @Deprecated public static boolean isAtLeastJava14() { return true; } /** * Convenience method to determine if the current JVM is at least * Java 1.5 (Java 5). * @return <code>true</code> if the current JVM is at least Java 1.5 * @deprecated as of Spring 3.0 which requires Java 1.5+ * @see #getMajorJavaVersion() * @see #JAVA_15 * @see #JAVA_16 * @see #JAVA_17 */ @Deprecated public static boolean isAtLeastJava15() { return true; } /** * Convenience method to determine if the current JVM is at least * Java 1.6 (Java 6). * @return <code>true</code> if the current JVM is at least Java 1.6 * @deprecated as of Spring 3.0, in favor of reflective checks for * the specific Java 1.6 classes of interest * @see #getMajorJavaVersion() * @see #JAVA_16 * @see #JAVA_17 */ @Deprecated public static boolean isAtLeastJava16() { return (majorJavaVersion >= JAVA_16); } }GetJdkVersion.java代码:public class GetJdkVersion { @SuppressWarnings("static-access") public static void main(String[] args) { JdkVersion jdkVersion = new JdkVersion() { }; System.out.println(jdkVersion.getJavaVersion()); } }测试信息:1.6.0_23。

Java命令行运行参数说明大全

Java命令行运行参数说明大全

一、 查看参数列表:
虚拟机参数分为基本和扩展两类,在命令行中输入JAVA_HOME"bin"java 就可得到基本参数列表,在命令行输入JAVA_HOME"bin"java –X 就可得到扩展参数列表。
二、 基本参数说明:
1. -client,-server
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
7. -verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
该参数用来监视虚拟机内存回收的情况。
8. Байду номын сангаасverbose:jni
13.-da[:<packagename>...|:<classname>]
14.-disableassertions[:<packagename>...|:<classname>]
用来设置虚拟机关闭断言处理,packagename和classname的使用方法和-ea相同。
15.-esa | -enablesystemassertions
10.-Xms<size>
设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。
例如:-Xms6400K,-Xms256M
11.-Xmx<size>
设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为1024整数倍,并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。

查看自己电脑java版本的9种方法 【java tester】

查看自己电脑java版本的9种方法 【java tester】

Troubleshooting: If you don't see a pink rectangle above, Java may not be installed. Or ZoneAlarm may be blocking the Java applet/program that displays the pink rectangle. Zone Alarm has a Mobile Code Control feature that, if set to "Custom", requires you to first enable mobile code from this web site (). Mac users that find that Safari isn't launching Java should see the Safari Java broken forum posting at regarding the "Open with Rosetta" option (thanks Eliot). In addition, your web browser may have Java disabled. See sample results. RECENT JAVA VERSIONS Version 1.6.x (a.k.a Java 6 Update x) As of January 3, 2011, the latest version of Java is 1.6.0_23 (a.k.a Version 6 Update 23) According to Oracle "Java SE 6u23 does not contain any additional fixes for security vulnerabilities to its previous release, Java SE 6u22. Users who have Java SE 6u22 have the latest security fixes and do not need to upgrade to this release to be current on security fixes." As of October 12, 2010, the latest version of Java is 1.6.0_22 (a.k.a Version 6 Update 22) As of July 27, 2010, the latest version of Java is 1.6.0_21 (a.k.a Version 6 Update 21) According to Sun this release "... does not contain any additional fixes for security /version.html 24-Mar-11

运行java的class文件方法详解

运行java的class文件方法详解

运⾏java的class⽂件⽅法详解⼀、运⾏class⽂件执⾏带main⽅法的class⽂件,命令⾏为:java <CLASS⽂件名>注意:CLASS⽂件名不要带⽂件后缀.class例如:复制代码代码如下:java Test如果执⾏的class⽂件是带包的,即在类⽂件中使⽤了:package <包名>那应该在包的基路径下执⾏,命令⾏为:java <包名>.CLASS⽂件名例如:PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:package com.ee2ee.test;PackageTest.java及编译后的class⽂件PackageTest.class的存放⽬录如下:classes|__com|__ee2ee|__test|__PackageTest.java|__PackageTest.class要运⾏PackageTest.class,应在classes⽬录下执⾏:复制代码代码如下:java com.ee2ee.test.PackageTest⼆、运⾏jar⽂件中的class原理和运⾏class⽂件⼀样,只需加上参数-cp <jar⽂件名>即可。

例如:执⾏test.jar中的类com.ee2ee.test.PackageTest,命令⾏如下:复制代码代码如下:java -cp test.jar com.ee2ee.test.PackageTest三、显⽰jdk版本信息当⼀台机器上有多个jdk版本时,需要知道当前使⽤的是那个版本的jdk,使⽤参数-version即可知道其版本,命令⾏为:复制代码代码如下:java -version四、增加虚拟机可以使⽤的最⼤内存java虚拟机可使⽤的最⼤内存是有限制的,缺省值通常为64MB或128MB。

如果⼀个应⽤程序为了提⾼性能⽽把数据加载内存中⽽占⽤较⼤的内存,⽐如超过了默认的最⼤值128MB,需要加⼤java虚拟机可使⽤的最⼤内存,否则会出现Out of Memory(系统内存不⾜)的异常。

java根据文件流判断文件类型(后缀名)

java根据文件流判断文件类型(后缀名)

java根据⽂件流判断⽂件类型(后缀名)import java.io.FileInputStream;public class FileType{public static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder();if (src == null || src.length <= 0) {return null;}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}/*** @param args*/public static void main(String[] args) throws Exception {FileInputStream is = new FileInputStream("F:\\相册\\微信图⽚\\03.jpg");byte[] b = new byte[3];is.read(b, 0, b.length);String xxx = bytesToHexString(b);xxx = xxx.toUpperCase();System.out.println("头⽂件是:" + xxx);String ooo = TypeDict.checkType(xxx);System.out.println("后缀名是:" + ooo);}}public class TypeDict {/**常⽤⽂件的⽂件头如下:(以前六位为准)JPEG (jpg),⽂件头:FFD8FFPNG (png),⽂件头:89504E47GIF (gif),⽂件头:47494638TIFF (tif),⽂件头:49492A00Windows Bitmap (bmp),⽂件头:424DCAD (dwg),⽂件头:41433130Adobe Photoshop (psd),⽂件头:38425053Rich Text Format (rtf),⽂件头:7B5C727466XML (xml),⽂件头:3C3F786D6CHTML (html),⽂件头:68746D6C3EEmail [thorough only] (eml),⽂件头:44656C69766572792D646174653AOutlook Express (dbx),⽂件头:CFAD12FEC5FD746FOutlook (pst),⽂件头:2142444EMS Word/Excel (xls.or.doc),⽂件头:D0CF11E0MS Access (mdb),⽂件头:5374616E64617264204AWordPerfect (wpd),⽂件头:FF575043Postscript (eps.or.ps),⽂件头:252150532D41646F6265Adobe Acrobat (pdf),⽂件头:255044462D312EQuicken (qdf),⽂件头:AC9EBD8FWindows Password (pwl),⽂件头:E3828596ZIP Archive (zip),⽂件头:504B0304RAR Archive (rar),⽂件头:52617221Wave (wav),⽂件头:57415645AVI (avi),⽂件头:41564920Real Audio (ram),⽂件头:2E7261FDReal Media (rm),⽂件头:2E524D46MPEG (mpg),⽂件头:000001BAMPEG (mpg),⽂件头:000001B3Quicktime (mov),⽂件头:6D6F6F76Windows Media (asf),⽂件头:3026B2758E66CF11MIDI (mid),⽂件头:4D546864*/public static String checkType(String xxxx) {switch (xxxx) {case "FFD8FF": return "jpg";case "89504E": return "png";case "474946": return "jif";default: return "0000";} } }。

java查看class文件编译时使用的编译器版本

java查看class文件编译时使用的编译器版本
网络错误421请刷新页面重试持续报错请尝试更换浏览器或网络环境
j用 java自带的工具,查看 class编译时使用的编译器版本。
命令行: $ javap -v ServiceImpl.class 或者 $ javap -verbose ServiceImpl.class
使用 Notepad++打开要查看的 class文件
在插件管理里面找到 HEX-Editor 这个插件,安装即可。 ,按快捷键 Ctrl+Alt+Shift+H 用16进制的方法查看。 只看第一行数据,前面8个字节CA FE BA BE 是固定的,之后4个字节00 00 是次版本号,次版本号后面的4个字节00 33 是jdk的版本 号,如我这里使用的是jdk1.7
我们可以看一下 jdk版本和major version对应关系: 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 由此,可以说明 ,依赖的jar包是经过jdk1.7 的编译器进行编译的。 -----
版本号对照表 -------------------------------

查看java类版本

查看java类版本

:IT群首页>> 语言编程>> JA V A/JSP>> Unsupported major.minor version 49.0错误详解Unsupported major.minor version 49.0错误详解浏览次数:22 次字体:[增加减小] 类型:转载关键字:Unsupported major.minor version 49.0错误详解一:要解决的问题我们在尝鲜JDK1.5 的时候,相信不少人遇到过Unsupported major.minor version 49.0 错误,当时定会茫然不知所措。

因为刚开始那会儿,网上与此相关的中文资料还不多,现在好了,网上一找就知道是如何解决,大多会告诉你要使用JDK 1.4 重新编译。

那么至于为什么,那个major.minor 究竟为何物呢?这就是本篇来讲的内容,以使未错而先知。

我觉得我是比较幸运的,因为在遇到那个错误之前已研读过《深入JA V A 虚拟机》第二版,英文原书名为《Inside the JA V A Virtual Machine》( Second Edition),看时已知晓major.minor 藏匿于何处,但没有切身体会,待到与Unsupported major.minor version 49.0 真正会面试,正好是给我验证了一个事实。

首先我们要对Unsupported major.minor version 49.0 建立的直接感觉是:JDK1.5 编译出来的类不能在JVM 1.4 下运行,必须编译成JVM 1.4 下能运行的类。

(当然,也许你用的还是JVM 1.3 或JVM 1.2,那么就要编译成目标JVM 能认可的类)。

这也解决问题的方向。

二:major.minor 栖身于何处何谓major.minor,且又居身于何处呢?先感性认识并找到major.minor 来。

写一个Java Hello World! 代码,然后用JDK 1.5 的编译器编译成,HelloWorld.javapackage com.unmi;publicclass HelloWorld{publicstaticvoid main(String[] args){System.out.println("Hello, World!");}}package com.unmi; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }用JDK 1.5 的javac -d . HelloWorld.java 编译出来的字节码HelloWorld.class 用UltraEdit 打开来的内容如图所示:从上图中我们看出来了什么是major.minor version 了,它相当于一个软件的主次版本号,只是在这里是标识的一个Java Class 的主版本号和次版本号,同时我们看到minor_version 为0x0000,major_version 为0x0031,转换为十制数分别为0 和49,即major.minor 就是49.0 了。

Java判断文件类型

Java判断文件类型

Java判断⽂件类型通常,在WEB系统中,上传⽂件时都需要做⽂件的类型校验,⼤致有如下⼏种⽅法:1. 通过后缀名,如exe,jpg,bmp,rar,zip等等。

2. 通过读取⽂件,获取⽂件的Content-type来判断。

3. 通过读取⽂件流,根据⽂件流中特定的⼀些字节标识来区分不同类型的⽂件。

4. 若是图⽚,则通过缩放来判断,可以缩放的为图⽚,不可以的则不是。

然⽽,在安全性较⾼的业务场景中,1,2两种⽅法的校验会被轻易绕过。

1. 伪造后缀名,如图⽚的,⾮常容易修改。

2. 伪造⽂件的Content-type,这个稍微复杂点,为了直观,截图如下:3.较安全,但是要读取⽂件,并有16进制转换等操作,性能稍差,但能满⾜⼀定条件下对安全的要求,所以建议使⽤。

但是⽂件头的信息也可以伪造,截图如下,对于图⽚可以采⽤图⽚缩放或者获取图⽚宽⾼的⽅法避免伪造头信息漏洞。

被伪装成gif的恶意图⽚⽂件对应的代码如下:[java]1. package apistudy;2.3. import java.awt.image.BufferedImage;4. import java.io.File;5. import java.io.FileInputStream;6. import java.io.FileNotFoundException;7. import java.io.IOException;8. import java.io.InputStream;9. import java.util.HashMap;10. import java.util.Iterator;11. import java.util.Map;12. import java.util.Map.Entry;13. import javax.imageio.ImageIO;14. import javax.imageio.ImageReader;15. import javax.imageio.stream.ImageInputStream;16.17. public class FileTypeTest18. {19. public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();20.21. private FileTypeTest(){}22. static{23. getAllFileType(); //初始化⽂件类型信息24. }25.26. /**27. * Created on 2010-7-128. * <p>Discription:[getAllFileType,常见⽂件头信息]</p>29. * @author:[shixing_11@]30. */31. private static void getAllFileType()32. {33. FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG (jpg)34. FILE_TYPE_MAP.put("png", "89504E47"); //PNG (png)35. FILE_TYPE_MAP.put("gif", "47494638"); //GIF (gif)36. FILE_TYPE_MAP.put("tif", "49492A00"); //TIFF (tif)37. FILE_TYPE_MAP.put("bmp", "424D"); //Windows Bitmap (bmp)38. FILE_TYPE_MAP.put("dwg", "41433130"); //CAD (dwg)39. FILE_TYPE_MAP.put("html", "68746D6C3E"); //HTML (html)40. FILE_TYPE_MAP.put("rtf", "7B5C727466"); //Rich Text Format (rtf)41. FILE_TYPE_MAP.put("xml", "3C3F786D6C");42. FILE_TYPE_MAP.put("zip", "504B0304");43. FILE_TYPE_MAP.put("rar", "52617221");44. FILE_TYPE_MAP.put("psd", "38425053"); //Photoshop (psd)45. FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); //Email [thorough only] (eml)46. FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); //Outlook Express (dbx)47. FILE_TYPE_MAP.put("pst", "2142444E"); //Outlook (pst)48. FILE_TYPE_MAP.put("xls", "D0CF11E0"); //MS Word49. FILE_TYPE_MAP.put("doc", "D0CF11E0"); //MS Excel 注意:word 和 excel的⽂件头⼀样50. FILE_TYPE_MAP.put("mdb", "5374616E64617264204A"); //MS Access (mdb)51. FILE_TYPE_MAP.put("wpd", "FF575043"); //WordPerfect (wpd)52. FILE_TYPE_MAP.put("eps", "252150532D41646F6265");53. FILE_TYPE_MAP.put("ps", "252150532D41646F6265");54. FILE_TYPE_MAP.put("pdf", "255044462D312E"); //Adobe Acrobat (pdf)55. FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); //Quicken (qdf)56. FILE_TYPE_MAP.put("pwl", "E3828596"); //Windows Password (pwl)57. FILE_TYPE_MAP.put("wav", "57415645"); //Wave (wav)58. FILE_TYPE_MAP.put("avi", "41564920");59. FILE_TYPE_MAP.put("ram", "2E7261FD"); //Real Audio (ram)60. FILE_TYPE_MAP.put("rm", "2E524D46"); //Real Media (rm)61. FILE_TYPE_MAP.put("mpg", "000001BA"); //62. FILE_TYPE_MAP.put("mov", "6D6F6F76"); //Quicktime (mov)63. FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); //Windows Media (asf)64. FILE_TYPE_MAP.put("mid", "4D546864"); //MIDI (mid)65. }66.67. public static void main(String[] args) throws Exception68. {69. File f = new File("c://aaa.gif");70. if (f.exists())71. {72. String filetype1 = getImageFileType(f);73. System.out.println(filetype1);74. String filetype2 = getFileByFile(f);75. System.out.println(filetype2);76. }77. }78.79. /**80. * Created on 2010-7-181. * <p>Discription:[getImageFileType,获取图⽚⽂件实际类型,若不是图⽚则返回null]</p>82. * @param File83. * @return fileType84. * @author:[shixing_11@]85. */86. public final static String getImageFileType(File f)87. {88. if (isImage(f))89. {90. try91. {92. ImageInputStream iis = ImageIO.createImageInputStream(f);93. Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);94. if (!iter.hasNext())95. {96. return null;97. }98. ImageReader reader = iter.next();99. iis.close();100. return reader.getFormatName();101. }102. catch (IOException e)103. {104. return null;105. }106. catch (Exception e)107. {108. return null;109. }110. }111. return null;112. }113.114. /**115. * Created on 2010-7-1116. * <p>Discription:[getFileByFile,获取⽂件类型,包括图⽚,若格式不是已配置的,则返回null]</p> 117. * @param file118. * @return fileType119. * @author:[shixing_11@]120. */121. public final static String getFileByFile(File file)122. {123. String filetype = null;124. byte[] b = new byte[50];125. try126. {127. InputStream is = new FileInputStream(file);128. is.read(b);129. filetype = getFileTypeByStream(b);130. is.close();131. }132. catch (FileNotFoundException e)133. {134. e.printStackTrace();135. }136. catch (IOException e)137. {138. e.printStackTrace();139. }140. return filetype;141. }142.143. /**144. * Created on 2010-7-1145. * <p>Discription:[getFileTypeByStream]</p>146. * @param b147. * @return fileType148. * @author:[shixing_11@]149. */150. public final static String getFileTypeByStream(byte[] b)151. {152. String filetypeHex = String.valueOf(getFileHexString(b));153. Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator(); 154. while (entryiterator.hasNext()) {155. Entry<String,String> entry = entryiterator.next();156. String fileTypeHexValue = entry.getValue();157. if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {158. return entry.getKey();159. }160. }161. return null;162. }163.164. /**165. * Created on 2010-7-2166. * <p>Discription:[isImage,判断⽂件是否为图⽚]</p>167. * @param file168. * @return true 是 | false 否169. * @author:[shixing_11@]170. */171. public static final boolean isImage(File file){172. boolean flag = false;173. try174. {175. BufferedImage bufreader = ImageIO.read(file);176. int width = bufreader.getWidth();177. int height = bufreader.getHeight();178. if(width==0 || height==0){179. flag = false;180. }else {181. flag = true;182. }183. }184. catch (IOException e)185. {186. flag = false;187. }catch (Exception e) {188. flag = false;189. }190. return flag;191. }192.193. /**194. * Created on 2010-7-1195. * <p>Discription:[getFileHexString]</p>196. * @param b197. * @return fileTypeHex198. * @author:[shixing_11@]199. */200. public final static String getFileHexString(byte[] b)201. {202. StringBuilder stringBuilder = new StringBuilder();203. if (b == null || b.length <= 0)204. {205. return null;206. }207. for (int i = 0; i < b.length; i++)208. {209. int v = b[i] & 0xFF;210. String hv = Integer.toHexString(v);211. if (hv.length() < 2)212. {213. stringBuilder.append(0);214. }215. stringBuilder.append(hv);216. }217. return stringBuilder.toString();218. }219. }这样,不管是传⼊的⽂件有后缀名,还是⽆后缀名,或者修改了后缀名,真正获取到的才是该⽂件的实际类型,这样避免了⼀些想通过修改后缀名或者Content-type信息来攻击的因素。

class文件版本问题

class文件版本问题

一.兼容规则
●.class文件中的5~8位是minor.major号
●minor.major代表次要版本号.主版本号
●minor.major号可以通过命令java –verbose 类名来查询
某个版本的JVM 能接受class 文件的最大主版本号(minor.major)不能超过对应JDK 带相应target 参数编译出来的class 文件的版本号。

例如jdk1.3.1_19当taget参数为-taget 1.3时编译的.class 的minor.major号为47.0那么此版本的jdk可以运行minor.major大于等于47.0的.class文件。

●结论:
根据兼容规则可以看出,使用较低版本进行编译时均可在较高版本上运行。

二.class文件内容
●class文件内容
按照顺序依次是magic码、minor.major版本号、常量池、access_flags(接口和类的相关标识)、this_class(对常量池的索引)、super_class、interfaces_count和interfaces、field_count 和fields(声明的字段的描述)、methods_count和methods(方法)、attributes_count和attributes (属性)。

不同版本.class的区别
minor.major不同
因新版本增加新功能会导致methods_count和methods不同(没有查到具体资料)。

eclipse怎么查看class文件(eclipse安装反编译插件)

eclipse怎么查看class文件(eclipse安装反编译插件)
(1)
(2)
(3) 上面的所有操作完成之后大功告成!可以直接进入对应的class文件看底层代码。
Байду номын сангаас
设置jadexe可执行文件的文件路径以及会生成的临时文件的路径
eclipse怎么查看 class文件( eclipse安装反编译插件)
本人eclipse版本: Eclipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2) 步骤1:下载两个我们需要的东西 (1)下载jadclipse插件: 下载地址: (2)下载jad.exe 文件地址: 步骤2:找到路径D:\eclipse\plugins 然后将下载好的net.sf.jadclipse_3.3.0.jar 放在该目录下。 步骤3:找到路径D:\eclipse\configuration 然后将org.eclipse.update 这整个文件删除。 步骤4:做完上面的操作之后一定要重启eclipse。 步骤5:设置jad.exe可执行文件的文件路径,以及会生成的临时文件的路径。如下步骤操作:

怎样知道自己电脑安装的java版本?教你用两种方法查看java版本

怎样知道自己电脑安装的java版本?教你用两种方法查看java版本

怎样知道自己电脑安装的java版本?教你用两种方法查看
java版本
怎样知道自己电脑安装的java版本?教你用两种方法查看java版本有时候为了编程,有时候为了手机应用一点点个性化修改。

很多都需要java环境,特别是哪些适合哪些版本,自己已经安装了什么版本。

对于菜鸟级别的机友基本上都不明白的。

怎样知道自己电脑安装的java版本?其实很简单。

小编今天教大家两种方法:
方法一:
直接看java的exe安装程序:
找到下载的exe安装程序;
鼠标右键点击exe文件,在弹出的菜单中点击“属性”:
进入到“属性”,从常规切换至“详细信息”界面,我们看到的“文件版本”和“产品版本”后的“6.0.310.79”就是该java的版本了:
方法二:
利用“命令”执行查看:
点击“开始”菜单,在底下的搜索框中输入“运行”并搜索,找到“运行”后点开,并在运行输入框中输入“cmd”点击“确定”,打开”命令”:
进入cmd后,在>后输入“java -version”并回车:
在得出的结果中我们看到“1.6.0_31”就是java的版本了,跟之前用EXE文件属性查到的版本号是一致的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

查看Java class文件版本的方法
查看的方法:
1.先装一个DJ java Decompiler 这个工具网上到处都是,主要就是反编译
Java class文件。

2.在DJ Java Decompiler的菜单中View->class version info,就会弹出对话框如:
Major Version: 49
Minor Version: 0
参照下面的引用,可知class由jdk1.5编译而来。

jackpk已经亲测,以上方法非常实用。

关于JDK版本,参见:
《unsupported major.minor version 解决方法》
(/jackpk/article/details/19755119)
引用
/javadetails/java-0544.html
The first 4 bytes are a magic number, 0xCAFEBABe, to identify a valid class file then the next 2 bytes identify the class format version (major and minor).
Possible major/minor value :
major minor Java platform version
45 3 1.0
45 3 1.1
46 0 1.2
47 0 1.3
48 0 1.4
49 0 1.5
50 0 1.6
import java.io.*;
public class ClassVersionChecker {
public static void main(String[] args) throws IOException {
for (int i = 0; i < args.length; i++)
checkClassVersion(args[i]);
}
private static void checkClassVersion(String filename)
throws IOException
{
DataInputStream in = new DataInputStream
(new FileInputStream(filename));
int magic = in.readInt();
if(magic != 0xcafebabe) {
System.out.println(filename + " is not a valid class!");;
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
System.out.println(filename + ": " + major + " . " + minor);
in.close();
}
}
> java ClassVersionChecker ClassVersionChecker.class ClassVersionChecker.class: 49 . 0
from The Java Virtual Machine Specification
magic
The magic item supplies the magic number identifying the class file format; it has
the value 0xCAFEBABE.
minor_version, major_version
The values of the minor_version and major_version items are the minor and major version numbers of this class file.Together, a major and a minor version number determine the version of the class file format. If a class file has major version number M and minor version number m, we denote the version of its class file format as M.m. Thus, class file format versions may be ordered lexicographically, for example, 1.5 < 2.0 < 2.1.
A Java virtual machine implementation can support a class file format of version v if and only if v lies in some contiguous range Mi.0 v Mj.m. Only Sun can specify what range of versions a Java virtual machine implementation conforming to a certain release level of the Java platform may support.。

相关文档
最新文档