-
2017-02-06 15:00:29
package lei; /** * 获取某一个类的类类型的方法 * @author Administrator * */ public class LeiName { public static void main(String[] args) { //方法一、通过类名调用自身隐含的class静态变量,通过class调用类类型 @SuppressWarnings("rawtypes") Class c1=LeiName.class; //方法二、通过对象调用该类继承与Object类的getClass方法 LeiName ln=new LeiName(); @SuppressWarnings("rawtypes") Class c2=ln.getClass(); //方法三、使用Class的forName方法,动态加载类 @SuppressWarnings("rawtypes") Class c3=null; try { c3=Class.forName("lei.LeiName"); } catch (ClassNotFoundException e) { } System.out.println(c1==c2); System.out.println(c2==c3); } } 结果为true
更多相关内容 -
Java如何获取泛型类型
2021-01-21 17:09:27Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String ... -
Java 获取泛型的类型实例详解
2020-08-30 10:23:36主要介绍了Java 获取泛型的类型实现代码的相关资料,需要的朋友可以参考下 -
java反射遍历实体类属性和类型,并赋值和获取值的简单方法
2020-08-30 20:27:38下面小编就为大家带来一篇java反射遍历实体类属性和类型,并赋值和获取值的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
Java获取文件的类型和扩展名的实现方法
2020-08-31 11:04:34主要介绍了Java获取文件的类型和扩展名的实现方法的相关资料,需要的朋友可以参考下 -
Java反射-获取类的属性类型
2021-08-25 16:11:49实体类User // package model; import java.math.BigDecimal; import java.util.Date; public class User { private String name; private String sex; private String phone; private Integer userNumber; ...实体类User
// package model; public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
利用反射,获取属性
// import java.lang.reflect.Field; // ---------------------------------------------------------- // getDeclaredField() 获取当前类的private、protected、public属性 Field field = User.class.getDeclaredField("name"); // 获取属性的类型 String nameTypeName = field.getType().getTypeName(); // System.out.println("name ------> " + nameTypeName); // 打印 // name ------> java.lang.String
比较属性类型
if (nameTypeName.equals(String.class.getTypeName())) {} // true
-
Java泛型类中方法如何获取泛型的实际类型
2021-10-12 17:49:29本文以“通用Excel处理器”为例,说明如何在抽象泛型类中的方法中,获取运行时的实际泛型类型Class,继而使用反射机制完成业务需求 import java.lang.reflect.ParameterizedType; /** * 通用Excel导入导出处理器 ...本文以“通用Excel处理器”为例,说明如何在抽象泛型类中的方法中,获取运行时的实际泛型类型Class,继而使用反射机制完成业务需求
import java.lang.reflect.ParameterizedType; /** * 通用Excel导入导出处理器 * * @param <I> 导入类型 * @param <E> 导出类型 */ public abstract class AbstractExcelHandler<I, E> { /** * 获取导入对象的Class类型 * 1. getClass().getGenericSuperclass()获取当前对象的直接超类Type,并将其向下强转为ParameterizedType(“参数化类型”) * 2. 由ParameterizedType获取泛型类的实际参数数组。我们可以访问其中期望位置的类型,例如I,索引值是0,再强转为Class<I>即可获取到I的类型 * @return */ @SuppressWarnings("unchecked") private Class<I> getImportClass() { return (Class<I>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } }
-
Java获取文件类型的5种方法
2021-02-05 08:00:00前言工作中经常会用到,判断一个文件的文件类型,这里总结一把,一般判断文件类型的原理有2种方式:根据文件扩展名判断优点:速度快,代码简单缺点:无法判断出真实的文件类型,例如一些伪造的文件或者...前言
工作中经常会用到,判断一个文件的文件类型,这里总结一把,一般判断文件类型的原理有2种方式:
根据文件扩展名判断
优点:速度快,代码简单
缺点:无法判断出真实的文件类型,例如一些伪造的文件或者没有后缀名称的文件
根据文件流中前几个字符判断
优点:可以判断出真实的文件类型
缺点:速度慢,代码复杂
下面我会针对每个方法,去测试验证,测试文件如下:
test.png
: 创建一个正常的png
文件,其扩展名为test.png
test.doc
: 复制一份上面的test.png
文件,修改其文件名称为test.doc
1. 使用Files.probeContentType
Java1.7开始,提供了用于解决MIME类型的方法 Files.probeContentType:
public static void test() throws IOException { Path path = new File("d:/test.png").toPath(); String mimeType = Files.probeContentType(path); System.out.println(mimeType); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc application/msword ❌ 此方法利用已安装的
FileTypeDetector
实现来探查MIME类型。它调用每个实现的probeContentType
来解析类型。但是,其默认实现是特定于操作系统的,并且可能会失败,具体取决于我们使用的操作系统。
结论:根据文件扩展名判断。
2. 使用URLConnection
URLConnection提供了几种用于检测文件的MIME类型的API。
2.1 使用getContentType
public void test(){ File file = new File("d:/test.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc image/png ✔️ 结论:根据文件流中前几个字符判断。能够判断真实的文件类型,但是,这种方法的主要缺点是速度非常慢。
2.2 使用guessContentTypeFromName
public void test(){ File file = new File("d:/test.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc null ❌ 具体参考下面的2.4 该方法利用内部的FileNameMap来判断MIME类型。
结论:根据文件扩展名判断。
2.3 使用guessContentTypeFromStream
public static void test() throws Exception { FileInputStream inputFile = new FileInputStream("d:/test.doc"); String mimeType = URLConnection.guessContentTypeFromStream(new BufferedInputStream(inputFile)); System.out.println(mimeType); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc image/png ✔️ 结论:根据文件流中前几个字符判断。
2.4 使用getFileNameMap
使用URLConnection获得MIME类型的更快方法是使用getFileNameMap()方法:
public void test(){ File file = new File("d:/test.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc null ❌ 该方法返回URLConnection的所有实例使用的MIME类型表。然后,该表用于解析输入文件类型。
当涉及URLConnection时,MIME类型的内置表非常有限。
默认情况下,该类使用content-types.properties文件,其所在目录为JRE_HOME/lib。但是,我们可以通过使用
content.types.user.table
属性指定用户特定的表来扩展它 :System.setProperty("content.types.user.table","<path-to-file>");
结论:根据文件扩展名判断。
3. 使用MimeTypesFileTypeMap
该类是Java 6附带的,因此在使用JDK 1.6时非常方便。
public void test() { File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc application/octet-stream ❌ 在这里,我们可以将文件名或File实例本身作为参数传递给函数。但是,以File实例为参数的函数在内部调用重载方法,该方法接受文件名作为参数。
在内部,此方法查找名为
mime.types
的文件以进行类型解析。请务必注意,该方法以特定顺序搜索文件:以编程方式将条目添加到MimetypesFileTypeMap实例
用户主目录中的mime.types
<java.home> /lib/mime.types
名为META-INF / mime.types的资源
名为META-INF / mimetypes.default的资源(通常仅在activation.jar文件中找到)
但是,如果找不到文件,它将返回application/octet-stream作为响应。
结论:根据文件扩展名判断。
4. 使用jmimemagic
jMimeMagic是一个受限制许可的库,我们可以使用它来获取文件的MIME类型。
配置Maven依赖:
<dependency> <groupId>net.sf.jmimemagic</groupId> <artifactId>jmimemagic</artifactId> <version>0.1.5</version> </dependency>
接下来,我们将探讨如何使用该库:
public void test() { File file = new File("d:/test.doc"); MagicMatch match = Magic.getMagicMatch(file, false); System.out.println(match.getMimeType()); }
该库可以处理数据流,因此不需要文件存在于文件系统中。
结果:
文件 结果 结论 test.png image/png ✔️ test.doc image/png ✔️ 结论:根据文件流中前几个字符判断。
5. 使用Apache Tika
Apache Tika是一个工具集,可检测并从各种文件中提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。
配置Maven依赖:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>1.18</version> </dependency>
接下来,我们将使用detect()方法来解析类型:
public void whenUsingTika_thenSuccess() { File file = new File("d:/test.doc"); Tika tika = new Tika(); String mimeType = tika.detect(file); }
结果:
文件 结果 结论 test.png image/png ✔️ test.doc image/png ✔️ 结论:根据文件流中前几个字符判断。
总结
根据判断原理总结分类如下:
判断原理 方式 根据文件扩展名 1.Files.probeContentType
2.URLConnection.guessContentTypeFromName
3.URLConnection.getFileNameMap
4.MimetypesFileTypeMap根据文件流中前几个字符 1.URLConnection.getContentType
2.URLConnection.guessContentTypeFromStream
3.jmimemagic
4.tika具体如何选择,依据需求而定
参考:https://www.baeldung.com/java-file-mime-type
往期推荐
关注我,每天陪你进步一点点!
-
java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名
2018-10-09 15:08:57java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目 -
java中获取泛型类的子类
2016-01-06 00:06:13通过反射获得指定类的父类的泛型参数的实际类型 -
JAVA 根据Url 接口 获取文件名称和类型
2018-05-23 11:44:56JAVA 根据Url 接口 获取文件名称和类型,亲测可用。输入参数地址即可。 -
java根据方法名称取得反射方法的参数类型示例
2020-09-04 14:57:15利用java反射原理调用方法时,常先需要传入方法参数数组才能取得方法。该方法参数数组采用动态取得的方式比较合适 -
java获取对象类型
2021-03-09 22:41:46public static void main(String args[]) {//String var = "123";...//TODO:判断数据类型Object param = var;if (param instanceof Integer) {int value = ((Integer) param).intValue();System.out.println(... -
Java的获取类型方法
2019-03-18 22:17:31* 获取类型方法 * */ public class Change { public static String getType(Object o){ //获取变量类型方法 return o.getClass().toString(); //使用Object类型的getClass()方法... -
Java 怎么获取传入泛型类的具体类型?
2021-03-08 08:17:18在 Java 反射中,对于一般的类,我们可以通过对象.getClass来获得类对象,然后通过类对象.getFields()可以获得类下的字段对象数组,以及字段对象.getType()来获得字段的具体类型,如下面源码中carClass.getFields()... -
java枚举结果类、根据状态值获取枚举值
2018-12-10 22:07:57java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list> -
Java 泛型获取实体类型
2021-12-19 16:39:20需要使用反射,获得指定类的父类的泛型参数的实际类型,直接上代码 getSuperClassGenricType public class GenericUtils { /** * 通过反射,获得指定类的父类的泛型参数的实际类型 * * @param clazz clazz ... -
java反射以及Class类类型
2018-12-10 02:46:42这种动态获取信息,以及动态调用对象的方法的功能称为java语言的反射机制 1.Class类的使用 在面向对象的世界中,万事万物都是对象 普通数据类型不是面向对象 比如int long 但是它们的包装类型 integer ... -
java 泛型类的类型识别示例
2010-06-21 16:26:00java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例 -
Java获取类或接口上的泛型类型T方法
2019-09-19 16:03:41前言 实际开发中,泛型使用到处可见。有时候定义接口时,经常使用泛型,而不是指定具体对象,...本篇讲述如何获取类或接口的泛型类型(参数化类型ParameterizedType)。 实例 1.定义泛型接口 public interface Res... -
java 获取对象的数据类型的方法
2021-02-12 10:21:45展开全部使用getClass方法可以获取一个对象的类型类,然后在调用该类的62616964757a686964616fe59b9ee7ad9431333363376530方法可以获取该类的相关信息,比如父类的名字,该类的名字等等:packagetest;importjava.... -
通过java反射机制获取类的所有属性类型、值
2021-06-03 10:38:35} } // 如果类型是Boolean 是封装类 if (field.getGenericType().toString().equals( "class java.lang.Boolean")) { Method m = (Method) object.getClass().getMethod( field.getName()); Boolean val = (Boolean... -
获取某个类的方法名及参数类型java
2019-06-11 16:39:09import java.lang.reflect.Method; public class Test1 { public static void main(String[] args) { try { Class<?>... //获取本类的所有方法,存放入数组 Method[] method... -
Java获取变量的数据类型
2021-03-29 15:37:09public class Enum { enum Color { RED, GREEN, BLUE; } // 执行输出结果 ... } public static String getType(Object o) { //获取变量类型方法 return o.getClass().toString(); // 使用int类型的getClass()方法 } } -
Java中获取数据的类型
2021-08-20 10:49:45在查阅相关资料以后发现Java中没有相应的内置函数来返回数据的类型,只能自己定义方法来获取数据的类型,索性就自己写一个方法来获取数据的类型。 提示:以下是本篇文章正文内容,下面案例可供参考 一、函数代码 ... -
获取Java类中所有Field
2021-02-25 20:10:09标签:importjava.lang.reflect.Field;importjava.util.ArrayList;.../***反射集合类**/publicclassReflectUtils{/***获取类clazz的所有Field,包括其父类的Field,如果重名,以子类Field为准。*@paramclazz*@return... -
Java-使用反射获取类型信息
2021-03-04 09:52:11一个简单类的例子在这个类中,有普通的String类型,有数组类型,有带泛型的List类型,有嵌套List类型,以及有多个泛型参数的简单类,这个类将作为我们后面的内容的基础。我们这一次博客解析如何使用反射获取到不同... -
java获取枚举类的所有属性
2021-02-28 08:03:59:通过取项目某个包路径下的所有枚举类来获取该类的所有属性直接上java代码:package com.xxx.common.ennum;import cn.hutool.core.util.ClassUtil;import java.lang.reflect.Method;import java.util.ArrayList;...