public final class ClassUtil extends Object
Class
工具类.
getCanonicalName()
VS getName()
VS
getSimpleName()
假设class 是
DatePattern
字段 说明 示例 getCanonicalName()
返回 Java Language Specification 中所定义的底层类的规范化名称。
如果底层类没有规范化名称(即如果底层类是一个组件类型没有规范化名称的本地类、匿名类或数组),则返回 null。"com.feilong.core.date.DatePattern" getName()
除了数组外,其他的类都是输出类全名,以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
- 1、此类对象表示的是非数组类型的引用类型
- 返回该类的二进制名称,Java Language Specification, Second Edition 对此作了详细说明。
- 2、此类对象表示一个基本类型或 void
- 返回的名字是一个与该基本类型或 void 所对应的 Java 语言关键字相同的 String。
- 3、此类对象表示一个数组类
- 名字的内部形式为:表示该数组嵌套深度的一个或多个 '[' 字符加元素类型名。
"com.feilong.core.date.DatePattern" getSimpleName()
返回源代码中给出的底层类的简称。
如果底层类是匿名的则返回一个空字符串。
数组的简称即附带 "[]" 的组件类型的简称。特别地,组件类型为匿名的数组的简称是 "[]"。"DatePattern"
getCanonicalName()
和getName()
其实这两个方法,对于大部分class来说,没有什么不同的
但是对于array就显示出来了.
getName()
返回的是[[Ljava.lang.String之类的表现形式,- 而
getCanonicalName()
返回的就是跟我们声明类似的形式.
字段 说明 instanceof运算符 针对实例,是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例
格式是:oo instanceof TypeName
第一个参数是对象实例名,第二个参数是具体的类名或接口名
instanceof是Java的一个二元操作符,==,>,<
和是同一类东东,作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据isAssignableFrom 针对class对象,是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口.
通常调用格式是Class1.isAssignableFrom(Class2)
调用者和参数都是java.lang.Class类型.isInstance(Object obj)方法 obj是被测试的对象,如果obj是调用这个方法的class或接口 的实例,则返回true.
这个方法是instanceof运算符的动态等价instanceof :子
----->
父
isAssignableFrom :父----->
子
ClassUtils
Modifier and Type | Method and Description |
---|---|
static Class<?> |
getClass(String className)
JVM查找并加载指定的类.
|
static boolean |
isAssignableFrom(Class<?> klass,
Class<?> cls)
Checks if is assignable from.
|
static boolean |
isInstance(Object obj,
Class<?> klass)
判断一个对象
obj 是不是某个类 klass 的实例. |
static boolean |
isInstanceAnyClass(Object obj,
Class<?>... klasses)
判断
obj 是否isInstance 任意的一个 klasses . |
static boolean |
isInterface(Class<?> ownerClass)
判断类
ownerClass 是否是接口. |
static Class<?>[] |
toClass(Object... paramValues)
解析对象参数
paramValues ,获得参数类型. |
public static boolean isInstance(Object obj, Class<?> klass)
obj
是不是某个类 klass
的实例.
- instanceof :子
----->
父- isAssignableFrom :父
----->
子
ClassUtil.isInstance(new User(), null) = false ClassUtil.isInstance(new User(), Comparable.class) = true ClassUtil.isInstance("1234", CharSequence.class) = true ClassUtil.isInstance("1234", Integer.class) = false ClassUtil.isInstance(null, CharSequence.class) = false ClassUtil.isInstance(null, Integer.class) = false
字段 说明 instanceof运算符 针对实例,是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例
instanceof是Java的一个二元操作符,和==,>,<
是同一类东东,作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据
格式是: oo instanceof TypeName
第一个参数是对象实例名,第二个参数是具体的类名或接口名
isAssignableFrom 针对class对象,是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口.
格式是: Class1.isAssignableFrom(Class2)
调用者和参数都是java.lang.Class类型.java.lang.Class.isInstance(Object obj)方法 obj是被测试的对象,如果obj是调用这个方法的class或接口 的实例,则返回true.
这个方法是instanceof运算符的 动态等价
obj
- 实例klass
- 类obj
是null,返回 falseklass
是null,返回 falseClass.isInstance(Object)
public static boolean isInstanceAnyClass(Object obj, Class<?>... klasses)
obj
是否isInstance 任意的一个 klasses
.
ClassUtil.isInstanceAnyClass(null, toArray(Integer.class, CharSequence.class)) = false ClassUtil.isInstanceAnyClass("1234", toArray(Comparable.class, CharSequence.class)) = true ClassUtil.isInstanceAnyClass(new User(), null) = false ClassUtil.isInstanceAnyClass(new User(), toArray(Comparable.class, CharSequence.class)) = true ClassUtil.isInstanceAnyClass(new User(), toArray(Integer.class, CharSequence.class)) = false
obj
- 任意的对象klasses
- the klassesnull == klasses
,返回 falsepublic static boolean isAssignableFrom(Class<?> klass, Class<?> cls)
instanceof :子 ----->
父
isAssignableFrom :父 ----->
子
ClassUtil.isAssignableFrom(Comparable.class, new User().getClass()) = true ClassUtil.isAssignableFrom(null, new User().getClass()) = false ClassUtil.isAssignableFrom(CharSequence.class, "1234".getClass()) = true ClassUtil.isAssignableFrom(CharSequence.class, null) = false
klass
- the klasscls
- the clsklass
是null,返回falsecls
是null,返回falseClass.isAssignableFrom(Class)
,
ClassUtils.isAssignable(Class, Class)
public static boolean isInterface(Class<?> ownerClass)
ownerClass
是否是接口.
ClassUtil.isInterface(null) = false ClassUtil.isInterface(DatePattern.class) = false ClassUtil.isInterface(Validator.class) = false ClassUtil.isInterface(CharSequence.class) = true ClassUtil.isInterface(List.class) = true ClassUtil.isInterface(Map.class) = true
ownerClass
- 对象classownerClass
是null,返回falseClass.getModifiers()
,
Modifier.isInterface(int)
public static Class<?>[] toClass(Object... paramValues)
paramValues
,获得参数类型.
assertArrayEquals(new Class[] { String.class, String.class }, ClassUtil.toClass("a", "a")); assertArrayEquals(new Class[] { Integer.class, Boolean.class }, ClassUtil.toClass(1, true));
paramValues
- 参数值paramValues
是null,返回 nullClassUtils.toClass(Object...)
,
ClassUtils.convertClassNamesToClasses(java.util.List)
public static Class<?> getClass(String className)
FeiLongVersion feiLongVersion = ClassUtil.loadClass("com.feilong.core.FeiLongVersion");
Class.forName(String)
的区别:
- 一般情况下 =
Class.forName(String)
- Returns the class represented by
className
using theclassLoader
.
支持 "java.util.Map.Entry[]
", "java.util.Map$Entry[]
", "[Ljava.util.Map.Entry;
", and "[Ljava.util.Map$Entry;
".会尝试从下面的顺序加载class:
字段 说明 Class klass=对象引用o.
getClass()
;返回引用o运行时真正所指的对象(因为:儿子对象的引用可能会赋给父对象的引用变量中)所属的类O的Class的对象.
谈不上对类O做什么操作.Class klass=A.class;
JVM将使用类A的类装载器,将类A装入内存(前提:类A还没有装入内存),不对类A做类的初始化工作.
返回类A的Class的对象.Class klass=
Class.forName
("类全名");装载连接初始化类. Class klass=
ClassLoader.loadClass
("类全名");装载类,不连接不初始化.
className
- 包名+类名,比如 "com.feilong.core.FeiLongVersion"className
是null,抛出 NullPointerException
className
是blank,抛出 IllegalArgumentException
className
找不到相关类,那么抛出 ReflectException
ClassLoader.loadClass(String)
,
Class.forName(String)
,
Class.forName(String, boolean, ClassLoader)
,
ClassUtils.getClass(String)
,
ClassUtils.getClass(ClassLoader, String, boolean)
,
"org.springframework.util.ClassUtils#forName(String, ClassLoader)"Copyright © 2008-2019 by feilong