/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.citrus.util; import static com.alibaba.citrus.test.TestUtil.*; import static com.alibaba.citrus.util.CollectionUtil.*; import static org.junit.Assert.*; import java.io.IOException; import java.io.Serializable; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.junit.Test; import org.slf4j.Logger; /** * 测试<code>ClassUtil</code>。 * * @author Michael Zhou */ public class ClassUtilTests { // ========================================================================== // 取得友好类名和package名的方法。 // ========================================================================== @Test public void getFriendlyClassName() { // null assertNull(ClassUtil.getFriendlyClassNameForObject(null)); assertNull(ClassUtil.getFriendlyClassName((Class<?>) null)); assertNull(ClassUtil.getFriendlyClassName((String) null)); assertEquals(" ", ClassUtil.getFriendlyClassName(" ")); // 数组 assertGetFriendlyClassName("int[]", new int[0]); assertGetFriendlyClassName("int[][]", new int[0][]); assertGetFriendlyClassName("long[]", new long[0]); assertGetFriendlyClassName("long[][]", new long[0][]); assertGetFriendlyClassName("short[]", new short[0]); assertGetFriendlyClassName("short[][]", new short[0][]); assertGetFriendlyClassName("byte[]", new byte[0]); assertGetFriendlyClassName("byte[][]", new byte[0][]); assertGetFriendlyClassName("char[]", new char[0]); assertGetFriendlyClassName("char[][]", new char[0][]); assertGetFriendlyClassName("boolean[]", new boolean[0]); assertGetFriendlyClassName("boolean[][]", new boolean[0][]); assertGetFriendlyClassName("float[]", new float[0]); assertGetFriendlyClassName("float[][]", new float[0][]); assertGetFriendlyClassName("double[]", new double[0]); assertGetFriendlyClassName("double[][]", new double[0][]); assertGetFriendlyClassName("java.util.List[]", new List[0]); assertGetFriendlyClassName("java.util.List[][]", new List[0][]); // 非数组 assertGetFriendlyClassName("java.util.ArrayList", createArrayList()); // 内联类/本地类/匿名类 assertGetFriendlyClassName("com.alibaba.citrus.util.ClassUtilTests.Inner", new Inner()); assertGetFriendlyClassName("com.alibaba.citrus.util.ClassUtilTests.Inner[]", new Inner[0]); class Local { } assertGetFriendlyClassName("com.alibaba.citrus.util.ClassUtilTests.1Local", new Local()); assertGetFriendlyClassName("com.alibaba.citrus.util.ClassUtilTests.1Local[]", new Local[0]); Object anonymous = new Serializable() { private static final long serialVersionUID = 4375828012902534105L; }; assertGetFriendlyClassName("com.alibaba.citrus.util.ClassUtilTests.1", anonymous); // 非法类名 assertEquals("", ClassUtil.getFriendlyClassName("")); assertEquals("[", ClassUtil.getFriendlyClassName("[")); assertEquals("[[", ClassUtil.getFriendlyClassName("[[")); assertEquals("[[X", ClassUtil.getFriendlyClassName("[[X")); assertEquals("[[L", ClassUtil.getFriendlyClassName("[[L")); assertEquals("[[L;", ClassUtil.getFriendlyClassName("[[L;")); assertEquals("[[Lx", ClassUtil.getFriendlyClassName("[[Lx")); } private void assertGetFriendlyClassName(String result, Object object) { // object assertEquals(result, ClassUtil.getFriendlyClassNameForObject(object)); // class assertEquals(result, ClassUtil.getFriendlyClassName(object.getClass())); // class name assertEquals(result, ClassUtil.getFriendlyClassName(object.getClass().getName())); assertEquals(result, ClassUtil.getFriendlyClassName(" " + object.getClass().getName() + " ")); // trim } @Test public void getSimpleClassName() { // null assertNull(ClassUtil.getSimpleClassNameForObject(null)); assertNull(ClassUtil.getSimpleClassName((Class<?>) null)); assertNull(ClassUtil.getSimpleClassName((String) null)); assertEquals(" ", ClassUtil.getSimpleClassName(" ")); // 普通类 assertGetSimpleClassName("ClassUtil", new ClassUtil(), true); assertGetSimpleClassName("String", "hello", true); // 内联类 assertGetSimpleClassName("ClassUtilTests.Inner", new Inner(), true); assertGetSimpleClassName("ClassUtilTests$Inner", new Inner(), false); // 内联类/本地类/匿名类 assertGetSimpleClassName("ClassUtilTests.Inner", new Inner(), true); assertGetSimpleClassName("ClassUtilTests$Inner[]", new Inner[0], false); class Local { } assertGetSimpleClassName("ClassUtilTests.2Local", new Local(), true); assertGetSimpleClassName("ClassUtilTests$2Local", new Local(), false); assertGetSimpleClassName("ClassUtilTests.2Local[]", new Local[0], true); assertGetSimpleClassName("ClassUtilTests$2Local[]", new Local[0], false); Object anonymous = new Serializable() { private static final long serialVersionUID = 4375828012902534105L; }; assertGetSimpleClassName("ClassUtilTests.2", anonymous, true); assertGetSimpleClassName("ClassUtilTests$2", anonymous, false); // 数组 assertGetSimpleClassName("int[]", new int[0], true); assertGetSimpleClassName("int[][]", new int[0][], true); assertGetSimpleClassName("long[]", new long[0], true); assertGetSimpleClassName("long[][]", new long[0][], true); assertGetSimpleClassName("short[]", new short[0], true); assertGetSimpleClassName("short[][]", new short[0][], true); assertGetSimpleClassName("byte[]", new byte[0], true); assertGetSimpleClassName("byte[][]", new byte[0][], true); assertGetSimpleClassName("char[]", new char[0], true); assertGetSimpleClassName("char[][]", new char[0][], true); assertGetSimpleClassName("boolean[]", new boolean[0], true); assertGetSimpleClassName("boolean[][]", new boolean[0][], true); assertGetSimpleClassName("float[]", new float[0], true); assertGetSimpleClassName("float[][]", new float[0][], true); assertGetSimpleClassName("double[]", new double[0], true); assertGetSimpleClassName("double[][]", new double[0][], true); assertGetSimpleClassName("String[]", new String[0], true); assertGetSimpleClassName("Map.Entry[]", new Map.Entry[0], true); assertGetSimpleClassName("Map$Entry[]", new Map.Entry[0], false); // 非法类名 assertEquals("", ClassUtil.getSimpleClassName("")); assertEquals("[", ClassUtil.getSimpleClassName("[")); assertEquals("[[", ClassUtil.getSimpleClassName("[[")); assertEquals("[[X", ClassUtil.getSimpleClassName("[[X")); assertEquals("[[L", ClassUtil.getSimpleClassName("[[L")); assertEquals("[[L;", ClassUtil.getSimpleClassName("[[L;")); assertEquals("[[Lx", ClassUtil.getSimpleClassName("[[Lx")); } private void assertGetSimpleClassName(String result, Object object, boolean proccessInnerClass) { if (proccessInnerClass) { // object assertEquals(result, ClassUtil.getSimpleClassNameForObject(object)); assertEquals(result, ClassUtil.getSimpleClassNameForObject(object, true)); // class assertEquals(result, ClassUtil.getSimpleClassName(object.getClass())); assertEquals(result, ClassUtil.getSimpleClassName(object.getClass(), true)); // class name assertEquals(result, ClassUtil.getSimpleClassName(object.getClass().getName())); assertEquals(result, ClassUtil.getSimpleClassName(object.getClass().getName(), true)); assertEquals(result, ClassUtil.getSimpleClassName(" " + object.getClass().getName() + " ")); // trim assertEquals(result, ClassUtil.getSimpleClassName(" " + object.getClass().getName() + " ", true)); // trim } else { // object assertEquals(result, ClassUtil.getSimpleClassNameForObject(object, proccessInnerClass)); // class assertEquals(result, ClassUtil.getSimpleClassName(object.getClass(), proccessInnerClass)); // class name assertEquals(result, ClassUtil.getSimpleClassName(object.getClass().getName(), proccessInnerClass)); assertEquals(result, ClassUtil.getSimpleClassName(" " + object.getClass().getName() + " ", proccessInnerClass)); // trim } } @SuppressWarnings("unused") static class MyClass { public final void func() { } private static int func(String s, long[] l) throws IOException, RuntimeException { return 0; } } @Test public void getSimpleMethodSignature() throws Exception { Method m1 = MyClass.class.getDeclaredMethod("func"); Method m2 = MyClass.class.getDeclaredMethod("func", String.class, long[].class); // null assertMethod(null, null, false, false, false, false); // modifiers, returnType, className, exceptionTypes assertMethod("public final void ClassUtilTests.MyClass.func()", m1, true, true, true, true); assertMethod( "private static int ClassUtilTests.MyClass.func(String, long[]) throws IOException, RuntimeException", m2, true, true, true, true); // modifiers, returnType, className, exceptionTypes assertMethod("public final void ClassUtilTests.MyClass.func()", m1, true, true, true, true); assertMethod( "private static int ClassUtilTests.MyClass.func(String, long[]) throws IOException, RuntimeException", m2, true, true, true, true); // no modifiers, returnType, className, exceptionTypes assertMethod("void ClassUtilTests.MyClass.func()", m1, false, true, true, true); assertMethod("int ClassUtilTests.MyClass.func(String, long[]) throws IOException, RuntimeException", m2, false, true, true, true); // no modifiers, no returnType, className, exceptionTypes assertMethod("ClassUtilTests.MyClass.func()", m1, false, false, true, true); assertMethod("ClassUtilTests.MyClass.func(String, long[]) throws IOException, RuntimeException", m2, false, false, true, true); // no modifiers, no returnType, no className, exceptionTypes assertMethod("func()", m1, false, false, false, true); assertMethod("func(String, long[]) throws IOException, RuntimeException", m2, false, false, false, true); // no modifiers, no returnType, no className, no exceptionTypes assertMethod("func()", m1, false, false, false, false); assertMethod("func(String, long[])", m2, false, false, false, false); // simple version assertEquals(null, ClassUtil.getSimpleMethodSignature(null)); assertEquals("func()", ClassUtil.getSimpleMethodSignature(m1)); assertEquals("func(String, long[])", ClassUtil.getSimpleMethodSignature(m2)); // simple version 2 assertEquals(null, ClassUtil.getSimpleMethodSignature(null, true)); assertEquals("ClassUtilTests.MyClass.func()", ClassUtil.getSimpleMethodSignature(m1, true)); assertEquals("func()", ClassUtil.getSimpleMethodSignature(m1, false)); assertEquals("ClassUtilTests.MyClass.func(String, long[])", ClassUtil.getSimpleMethodSignature(m2, true)); assertEquals("func(String, long[])", ClassUtil.getSimpleMethodSignature(m2, false)); } private void assertMethod(String str, Method method, boolean withModifiers, boolean withReturnType, boolean withClassName, boolean withExceptionType) { assertEquals(str, ClassUtil.getSimpleMethodSignature(method, withModifiers, withReturnType, withClassName, withExceptionType)); } @Test public void getPackageName() { // null assertEquals("", ClassUtil.getPackageNameForObject(null)); assertEquals("", ClassUtil.getPackageName((Class<?>) null)); assertEquals("", ClassUtil.getPackageName((String) null)); assertEquals("", ClassUtil.getPackageName(" ")); // 数组 assertGetPackageName("", new int[0]); assertGetPackageName("", new int[0][]); assertGetPackageName("", new long[0]); assertGetPackageName("", new long[0][]); assertGetPackageName("", new short[0]); assertGetPackageName("", new short[0][]); assertGetPackageName("", new byte[0]); assertGetPackageName("", new byte[0][]); assertGetPackageName("", new char[0]); assertGetPackageName("", new char[0][]); assertGetPackageName("", new boolean[0]); assertGetPackageName("", new boolean[0][]); assertGetPackageName("", new float[0]); assertGetPackageName("", new float[0][]); assertGetPackageName("", new double[0]); assertGetPackageName("", new double[0][]); assertGetPackageName("java.util", new List[0]); assertGetPackageName("java.util", new List[0][]); // 非数组 assertGetPackageName("java.util", createArrayList()); assertGetPackageName("com.alibaba.citrus.util", new ClassUtil()); assertGetPackageName("com.alibaba.citrus.util", new Inner()); assertGetPackageName("java.lang", new Integer[0]); // 内联类/本地类/匿名类 assertGetPackageName("com.alibaba.citrus.util", new Inner()); assertGetPackageName("com.alibaba.citrus.util", new Inner[0]); class Local { } assertGetPackageName("com.alibaba.citrus.util", new Local()); assertGetPackageName("com.alibaba.citrus.util", new Local[0]); Object anonymous = new Serializable() { private static final long serialVersionUID = 4375828012902534105L; }; assertGetPackageName("com.alibaba.citrus.util", anonymous); // 非法类名 assertEquals("", ClassUtil.getPackageName("")); assertEquals("", ClassUtil.getPackageName("[")); assertEquals("", ClassUtil.getPackageName("[[")); assertEquals("", ClassUtil.getPackageName("[[X")); assertEquals("", ClassUtil.getPackageName("[[L")); assertEquals("", ClassUtil.getPackageName("[[L;")); assertEquals("", ClassUtil.getPackageName("[[Lx")); } private void assertGetPackageName(String result, Object object) { // object assertEquals(result, ClassUtil.getPackageNameForObject(object)); // class assertEquals(result, ClassUtil.getPackageName(object.getClass())); // class name assertEquals(result, ClassUtil.getPackageName(object.getClass().getName())); assertEquals(result, ClassUtil.getPackageName(" " + object.getClass().getName() + " ")); // trim } // ========================================================================== // 取得类名和package名的resource名的方法。 // // 和类名、package名不同的是,resource名符合文件名命名规范,例如: // java/lang/String.class // com/alibaba/commons/lang // etc. // ========================================================================== @Test public void getResourceNameForObjectClass() { // null assertNull(ClassUtil.getResourceNameForObjectClass(null)); // 非数组 assertEquals("java/util/ArrayList.class", ClassUtil.getResourceNameForObjectClass(createArrayList())); // 内联类 assertEquals("com/alibaba/citrus/util/ClassUtilTests$Inner.class", ClassUtil.getResourceNameForObjectClass(new Inner())); } @Test public void getResourceNameForClass() { // null assertNull(ClassUtil.getResourceNameForClass((Class<?>) null)); // 非数组 assertEquals("java/util/ArrayList.class", ClassUtil.getResourceNameForClass(ArrayList.class)); // 内联类 assertEquals("com/alibaba/citrus/util/ClassUtilTests$Inner.class", ClassUtil.getResourceNameForClass(Inner.class)); } @Test public void getResourceNameForClassName() { // null assertNull(ClassUtil.getResourceNameForClass((String) null)); // 非数组 assertEquals("java/util/ArrayList.class", ClassUtil.getResourceNameForClass(ArrayList.class.getName())); // 内联类 assertEquals("com/alibaba/citrus/util/ClassUtilTests$Inner.class", ClassUtil.getResourceNameForClass(Inner.class.getName())); } @Test public void getResourceNameForObjectPackage() { assertNull(ClassUtil.getResourceNameForObjectPackage(null)); assertEquals("com/alibaba/citrus/util", ClassUtil.getResourceNameForObjectPackage(new ClassUtil())); assertEquals("com/alibaba/citrus/util", ClassUtil.getResourceNameForObjectPackage(new Inner())); assertEquals("java/lang", ClassUtil.getResourceNameForObjectPackage(new Integer[0])); assertEquals("", ClassUtil.getResourceNameForObjectPackage(new int[0])); } @Test public void getResourceNameForPackage() { assertNull(ClassUtil.getResourceNameForPackage((Class<?>) null)); assertEquals("java/lang", ClassUtil.getResourceNameForPackage(String.class)); assertEquals("java/util", ClassUtil.getResourceNameForPackage(Map.Entry.class)); assertEquals("java/lang", ClassUtil.getResourceNameForPackage(Integer[].class)); assertEquals("", ClassUtil.getResourceNameForPackage(int[].class)); } @Test public void getResourceNameForPackageName() { assertNull(ClassUtil.getResourceNameForPackage((String) null)); assertEquals("com/alibaba/citrus/util", ClassUtil.getResourceNameForPackage(ClassUtil.class.getName())); assertEquals("java/util", ClassUtil.getResourceNameForPackage(Map.Entry.class.getName())); assertEquals("java/lang", ClassUtil.getResourceNameForPackage(Integer[].class.getName())); assertEquals("", ClassUtil.getResourceNameForPackage(int[].class.getName())); } // ========================================================================== // 取得数组类。 // ========================================================================== @Test public void getArrayClass() { // dim < 0 try { ClassUtil.getArrayClass(int.class, -1); fail(); } catch (IllegalArgumentException e) { assertThat(e, exception("wrong dimension: -1")); } // null assertNull(ClassUtil.getArrayClass(null, 1)); // form 1 assertEquals(int[].class, ClassUtil.getArrayClass(int.class)); assertEquals(int[][].class, ClassUtil.getArrayClass(int[].class)); assertEquals(Integer[].class, ClassUtil.getArrayClass(Integer.class)); assertEquals(Integer[][].class, ClassUtil.getArrayClass(Integer[].class)); // form 2 assertEquals(int.class, ClassUtil.getArrayClass(int.class, 0)); assertEquals(int[].class, ClassUtil.getArrayClass(int.class, 1)); assertEquals(int[][].class, ClassUtil.getArrayClass(int.class, 2)); assertEquals(int[].class, ClassUtil.getArrayClass(int[].class, 0)); assertEquals(int[][].class, ClassUtil.getArrayClass(int[].class, 1)); assertEquals(int[][][].class, ClassUtil.getArrayClass(int[].class, 2)); assertEquals(String.class, ClassUtil.getArrayClass(String.class, 0)); assertEquals(String[].class, ClassUtil.getArrayClass(String.class, 1)); assertEquals(String[][].class, ClassUtil.getArrayClass(String.class, 2)); assertEquals(ClassUtilTests[].class, ClassUtil.getArrayClass(ClassUtilTests[].class, 0)); assertEquals(ClassUtilTests[][].class, ClassUtil.getArrayClass(ClassUtilTests[].class, 1)); assertEquals(ClassUtilTests[][][].class, ClassUtil.getArrayClass(ClassUtilTests[].class, 2)); } // ========================================================================== // 取得原子类型或者其wrapper类。 // ========================================================================== @Test public void getPrimitiveType_byName() { assertEquals(int.class, ClassUtil.getPrimitiveType("int")); assertEquals(long.class, ClassUtil.getPrimitiveType("long")); assertEquals(short.class, ClassUtil.getPrimitiveType("short")); assertEquals(double.class, ClassUtil.getPrimitiveType("double")); assertEquals(float.class, ClassUtil.getPrimitiveType("float")); assertEquals(char.class, ClassUtil.getPrimitiveType("char")); assertEquals(byte.class, ClassUtil.getPrimitiveType("byte")); assertEquals(boolean.class, ClassUtil.getPrimitiveType("boolean")); assertEquals(void.class, ClassUtil.getPrimitiveType("void")); assertEquals(int.class, ClassUtil.getPrimitiveType("java.lang.Integer")); assertEquals(long.class, ClassUtil.getPrimitiveType("java.lang.Long")); assertEquals(short.class, ClassUtil.getPrimitiveType("java.lang.Short")); assertEquals(double.class, ClassUtil.getPrimitiveType("java.lang.Double")); assertEquals(float.class, ClassUtil.getPrimitiveType("java.lang.Float")); assertEquals(char.class, ClassUtil.getPrimitiveType("java.lang.Character")); assertEquals(byte.class, ClassUtil.getPrimitiveType("java.lang.Byte")); assertEquals(boolean.class, ClassUtil.getPrimitiveType("java.lang.Boolean")); assertEquals(void.class, ClassUtil.getPrimitiveType("java.lang.Void")); assertEquals(null, ClassUtil.getPrimitiveType("java.lang.String")); } @Test public void getPrimitiveType_byType() { assertEquals(int.class, ClassUtil.getPrimitiveType(Integer.class)); assertEquals(long.class, ClassUtil.getPrimitiveType(Long.class)); assertEquals(short.class, ClassUtil.getPrimitiveType(Short.class)); assertEquals(double.class, ClassUtil.getPrimitiveType(Double.class)); assertEquals(float.class, ClassUtil.getPrimitiveType(Float.class)); assertEquals(char.class, ClassUtil.getPrimitiveType(Character.class)); assertEquals(byte.class, ClassUtil.getPrimitiveType(Byte.class)); assertEquals(boolean.class, ClassUtil.getPrimitiveType(Boolean.class)); assertEquals(void.class, ClassUtil.getPrimitiveType(Void.class)); assertEquals(null, ClassUtil.getPrimitiveType(String.class)); } @Test public void getWrapperTypeIfPrimitive() { assertEquals(Integer.class, ClassUtil.getWrapperTypeIfPrimitive(int.class)); assertEquals(Long.class, ClassUtil.getWrapperTypeIfPrimitive(long.class)); assertEquals(Short.class, ClassUtil.getWrapperTypeIfPrimitive(short.class)); assertEquals(Double.class, ClassUtil.getWrapperTypeIfPrimitive(double.class)); assertEquals(Float.class, ClassUtil.getWrapperTypeIfPrimitive(float.class)); assertEquals(Character.class, ClassUtil.getWrapperTypeIfPrimitive(char.class)); assertEquals(Byte.class, ClassUtil.getWrapperTypeIfPrimitive(byte.class)); assertEquals(Boolean.class, ClassUtil.getWrapperTypeIfPrimitive(boolean.class)); assertEquals(Void.class, ClassUtil.getWrapperTypeIfPrimitive(void.class)); assertEquals(int[][].class, ClassUtil.getWrapperTypeIfPrimitive(int[][].class)); assertEquals(long[][].class, ClassUtil.getWrapperTypeIfPrimitive(long[][].class)); assertEquals(short[][].class, ClassUtil.getWrapperTypeIfPrimitive(short[][].class)); assertEquals(double[][].class, ClassUtil.getWrapperTypeIfPrimitive(double[][].class)); assertEquals(float[][].class, ClassUtil.getWrapperTypeIfPrimitive(float[][].class)); assertEquals(char[][].class, ClassUtil.getWrapperTypeIfPrimitive(char[][].class)); assertEquals(byte[][].class, ClassUtil.getWrapperTypeIfPrimitive(byte[][].class)); assertEquals(boolean[][].class, ClassUtil.getWrapperTypeIfPrimitive(boolean[][].class)); assertEquals(String.class, ClassUtil.getWrapperTypeIfPrimitive(String.class)); assertEquals(String[][].class, ClassUtil.getWrapperTypeIfPrimitive(String[][].class)); } @Test public void getPrimitiveDefaultValue() { assertEquals(new Integer(0), ClassUtil.getPrimitiveDefaultValue(int.class)); assertEquals(new Long(0), ClassUtil.getPrimitiveDefaultValue(long.class)); assertEquals(new Short((short) 0), ClassUtil.getPrimitiveDefaultValue(short.class)); assertEquals(new Double(0), ClassUtil.getPrimitiveDefaultValue(double.class)); assertEquals(new Float(0), ClassUtil.getPrimitiveDefaultValue(float.class)); assertEquals(new Character('\0'), ClassUtil.getPrimitiveDefaultValue(char.class)); assertEquals(new Byte((byte) 0), ClassUtil.getPrimitiveDefaultValue(byte.class)); assertEquals(Boolean.FALSE, ClassUtil.getPrimitiveDefaultValue(boolean.class)); assertEquals(null, ClassUtil.getPrimitiveDefaultValue(void.class)); assertEquals(new Integer(0), ClassUtil.getPrimitiveDefaultValue(Integer.class)); assertEquals(new Long(0), ClassUtil.getPrimitiveDefaultValue(Long.class)); assertEquals(new Short((short) 0), ClassUtil.getPrimitiveDefaultValue(Short.class)); assertEquals(new Double(0), ClassUtil.getPrimitiveDefaultValue(Double.class)); assertEquals(new Float(0), ClassUtil.getPrimitiveDefaultValue(Float.class)); assertEquals(new Character('\0'), ClassUtil.getPrimitiveDefaultValue(Character.class)); assertEquals(new Byte((byte) 0), ClassUtil.getPrimitiveDefaultValue(Byte.class)); assertEquals(Boolean.FALSE, ClassUtil.getPrimitiveDefaultValue(Boolean.class)); assertEquals(null, ClassUtil.getPrimitiveDefaultValue(Void.class)); assertEquals(null, ClassUtil.getPrimitiveDefaultValue(String.class)); assertEquals(null, (Object) ClassUtil.getPrimitiveDefaultValue(long[][].class)); } // ========================================================================== // 类型匹配。 // ========================================================================== @Test public void isAssignable_classArray() { Class<?>[] array2 = new Class<?>[] { Object.class, Object.class }; Class<?>[] array1 = new Class<?>[] { Object.class }; Class<?>[] array1s = new Class<?>[] { String.class }; Class<?>[] array0 = new Class<?>[] { }; assertFalse(ClassUtil.isAssignable(array2, array1)); assertFalse(ClassUtil.isAssignable(array2, null)); assertTrue(ClassUtil.isAssignable(array0, null)); assertTrue(ClassUtil.isAssignable(array0, array0)); assertTrue(ClassUtil.isAssignable(null, array0)); assertTrue(ClassUtil.isAssignable((Class<?>[]) null, (Class<?>[]) null)); assertFalse(ClassUtil.isAssignable(array1s, array1)); assertTrue(ClassUtil.isAssignable(array1s, array1s)); assertTrue(ClassUtil.isAssignable(array1, array1s)); } @Test public void isAssignable_class() { // clazz=null, fromClass=* assertFalse(ClassUtil.isAssignable((Class<?>) null, null)); assertFalse(ClassUtil.isAssignable((Class<?>) null, String.class)); // clazz=reference type, fromClass=null assertTrue(ClassUtil.isAssignable(String.class, null)); // clazz=primitive type, fromClass=null assertFalse(ClassUtil.isAssignable(int.class, null)); // clazz.isAssignableFrom(fromClass) assertTrue(ClassUtil.isAssignable(Object.class, String.class)); assertTrue(ClassUtil.isAssignable(String.class, String.class)); assertFalse(ClassUtil.isAssignable(String.class, Object.class)); assertFalse(ClassUtil.isAssignable(Integer.class, Integer.TYPE)); assertFalse(ClassUtil.isAssignable(Long.class, Long.TYPE)); assertFalse(ClassUtil.isAssignable(Short.class, Short.TYPE)); assertFalse(ClassUtil.isAssignable(Byte.class, Byte.TYPE)); assertFalse(ClassUtil.isAssignable(Double.class, Double.TYPE)); assertFalse(ClassUtil.isAssignable(Float.class, Float.TYPE)); assertFalse(ClassUtil.isAssignable(Character.class, Character.TYPE)); assertFalse(ClassUtil.isAssignable(Boolean.class, Boolean.TYPE)); } @Test public void isAssignable_widening() { // boolean可以接受:boolean assertTrue("boolean = boolean", ClassUtil.isAssignable(boolean.class, boolean.class)); assertTrue("boolean = Boolean", ClassUtil.isAssignable(boolean.class, Boolean.class)); assertFalse("boolean = char", ClassUtil.isAssignable(boolean.class, char.class)); assertFalse("boolean = Character", ClassUtil.isAssignable(boolean.class, Character.class)); assertFalse("boolean = int", ClassUtil.isAssignable(boolean.class, int.class)); assertFalse("boolean = Integer", ClassUtil.isAssignable(boolean.class, Integer.class)); assertFalse("boolean = long", ClassUtil.isAssignable(boolean.class, long.class)); assertFalse("boolean = Long", ClassUtil.isAssignable(boolean.class, Long.class)); assertFalse("boolean = short", ClassUtil.isAssignable(boolean.class, short.class)); assertFalse("boolean = Short", ClassUtil.isAssignable(boolean.class, Short.class)); assertFalse("boolean = byte", ClassUtil.isAssignable(boolean.class, byte.class)); assertFalse("boolean = Byte", ClassUtil.isAssignable(boolean.class, Byte.class)); assertFalse("boolean = double", ClassUtil.isAssignable(boolean.class, double.class)); assertFalse("boolean = Double", ClassUtil.isAssignable(boolean.class, Double.class)); assertFalse("boolean = float", ClassUtil.isAssignable(boolean.class, float.class)); assertFalse("boolean = Float", ClassUtil.isAssignable(boolean.class, Float.class)); // byte可以接受:byte assertFalse("byte = boolean", ClassUtil.isAssignable(byte.class, boolean.class)); assertFalse("byte = Boolean", ClassUtil.isAssignable(byte.class, Boolean.class)); assertFalse("byte = char", ClassUtil.isAssignable(byte.class, char.class)); assertFalse("byte = Character", ClassUtil.isAssignable(byte.class, Character.class)); assertFalse("byte = int", ClassUtil.isAssignable(byte.class, int.class)); assertFalse("byte = Integer", ClassUtil.isAssignable(byte.class, Integer.class)); assertFalse("byte = long", ClassUtil.isAssignable(byte.class, long.class)); assertFalse("byte = Long", ClassUtil.isAssignable(byte.class, Long.class)); assertFalse("byte = short", ClassUtil.isAssignable(byte.class, short.class)); assertFalse("byte = Short", ClassUtil.isAssignable(byte.class, Short.class)); assertTrue("byte = byte", ClassUtil.isAssignable(byte.class, byte.class)); assertTrue("byte = Byte", ClassUtil.isAssignable(byte.class, Byte.class)); assertFalse("byte = double", ClassUtil.isAssignable(byte.class, double.class)); assertFalse("byte = Double", ClassUtil.isAssignable(byte.class, Double.class)); assertFalse("byte = float", ClassUtil.isAssignable(byte.class, float.class)); assertFalse("byte = Float", ClassUtil.isAssignable(byte.class, Float.class)); // char可以接受:char assertFalse("char = boolean", ClassUtil.isAssignable(char.class, boolean.class)); assertFalse("char = Boolean", ClassUtil.isAssignable(char.class, Boolean.class)); assertTrue("char = char", ClassUtil.isAssignable(char.class, char.class)); assertTrue("char = Character", ClassUtil.isAssignable(char.class, Character.class)); assertFalse("char = int", ClassUtil.isAssignable(char.class, int.class)); assertFalse("char = Integer", ClassUtil.isAssignable(char.class, Integer.class)); assertFalse("char = long", ClassUtil.isAssignable(char.class, long.class)); assertFalse("char = Long", ClassUtil.isAssignable(char.class, Long.class)); assertFalse("char = short", ClassUtil.isAssignable(char.class, short.class)); assertFalse("char = Short", ClassUtil.isAssignable(char.class, Short.class)); assertFalse("char = byte", ClassUtil.isAssignable(char.class, byte.class)); assertFalse("char = Byte", ClassUtil.isAssignable(char.class, Byte.class)); assertFalse("char = double", ClassUtil.isAssignable(char.class, double.class)); assertFalse("char = Double", ClassUtil.isAssignable(char.class, Double.class)); assertFalse("char = float", ClassUtil.isAssignable(char.class, float.class)); assertFalse("char = Float", ClassUtil.isAssignable(char.class, Float.class)); // short可以接受:short, byte assertFalse("short = boolean", ClassUtil.isAssignable(short.class, boolean.class)); assertFalse("short = Boolean", ClassUtil.isAssignable(short.class, Boolean.class)); assertFalse("short = char", ClassUtil.isAssignable(short.class, char.class)); assertFalse("short = Character", ClassUtil.isAssignable(short.class, Character.class)); assertFalse("short = int", ClassUtil.isAssignable(short.class, int.class)); assertFalse("short = Integer", ClassUtil.isAssignable(short.class, Integer.class)); assertFalse("short = long", ClassUtil.isAssignable(short.class, long.class)); assertFalse("short = Long", ClassUtil.isAssignable(short.class, Long.class)); assertTrue("short = short", ClassUtil.isAssignable(short.class, short.class)); assertTrue("short = Short", ClassUtil.isAssignable(short.class, Short.class)); assertTrue("short = byte", ClassUtil.isAssignable(short.class, byte.class)); assertTrue("short = Byte", ClassUtil.isAssignable(short.class, Byte.class)); assertFalse("short = double", ClassUtil.isAssignable(short.class, double.class)); assertFalse("short = Double", ClassUtil.isAssignable(short.class, Double.class)); assertFalse("short = float", ClassUtil.isAssignable(short.class, float.class)); assertFalse("short = Float", ClassUtil.isAssignable(short.class, Float.class)); // int可以接受:int、byte、short、char assertFalse("int = boolean", ClassUtil.isAssignable(int.class, boolean.class)); assertFalse("int = Boolean", ClassUtil.isAssignable(int.class, Boolean.class)); assertTrue("int = char", ClassUtil.isAssignable(int.class, char.class)); assertTrue("int = Character", ClassUtil.isAssignable(int.class, Character.class)); assertTrue("int = int", ClassUtil.isAssignable(int.class, int.class)); assertTrue("int = Integer", ClassUtil.isAssignable(int.class, Integer.class)); assertFalse("int = long", ClassUtil.isAssignable(int.class, long.class)); assertFalse("int = Long", ClassUtil.isAssignable(int.class, Long.class)); assertTrue("int = short", ClassUtil.isAssignable(int.class, short.class)); assertTrue("int = Short", ClassUtil.isAssignable(int.class, Short.class)); assertTrue("int = byte", ClassUtil.isAssignable(int.class, byte.class)); assertTrue("int = Byte", ClassUtil.isAssignable(int.class, Byte.class)); assertFalse("int = double", ClassUtil.isAssignable(int.class, double.class)); assertFalse("int = Double", ClassUtil.isAssignable(int.class, Double.class)); assertFalse("int = float", ClassUtil.isAssignable(int.class, float.class)); assertFalse("int = Float", ClassUtil.isAssignable(int.class, Float.class)); // long可以接受:long、int、byte、short、char assertFalse("long = boolean", ClassUtil.isAssignable(long.class, boolean.class)); assertFalse("long = Boolean", ClassUtil.isAssignable(long.class, Boolean.class)); assertTrue("long = char", ClassUtil.isAssignable(long.class, char.class)); assertTrue("long = Character", ClassUtil.isAssignable(long.class, Character.class)); assertTrue("long = int", ClassUtil.isAssignable(long.class, int.class)); assertTrue("long = Integer", ClassUtil.isAssignable(long.class, Integer.class)); assertTrue("long = long", ClassUtil.isAssignable(long.class, long.class)); assertTrue("long = Long", ClassUtil.isAssignable(long.class, Long.class)); assertTrue("long = short", ClassUtil.isAssignable(long.class, short.class)); assertTrue("long = Short", ClassUtil.isAssignable(long.class, Short.class)); assertTrue("long = byte", ClassUtil.isAssignable(long.class, byte.class)); assertTrue("long = Byte", ClassUtil.isAssignable(long.class, Byte.class)); assertFalse("long = double", ClassUtil.isAssignable(long.class, double.class)); assertFalse("long = Double", ClassUtil.isAssignable(long.class, Double.class)); assertFalse("long = float", ClassUtil.isAssignable(long.class, float.class)); assertFalse("long = Float", ClassUtil.isAssignable(long.class, Float.class)); // float可以接受:float, long, int, byte, short, char assertFalse("float = boolean", ClassUtil.isAssignable(float.class, boolean.class)); assertFalse("float = Boolean", ClassUtil.isAssignable(float.class, Boolean.class)); assertTrue("float = char", ClassUtil.isAssignable(float.class, char.class)); assertTrue("float = Character", ClassUtil.isAssignable(float.class, Character.class)); assertTrue("float = int", ClassUtil.isAssignable(float.class, int.class)); assertTrue("float = Integer", ClassUtil.isAssignable(float.class, Integer.class)); assertTrue("float = long", ClassUtil.isAssignable(float.class, long.class)); assertTrue("float = Long", ClassUtil.isAssignable(float.class, Long.class)); assertTrue("float = short", ClassUtil.isAssignable(float.class, short.class)); assertTrue("float = Short", ClassUtil.isAssignable(float.class, Short.class)); assertTrue("float = byte", ClassUtil.isAssignable(float.class, byte.class)); assertTrue("float = Byte", ClassUtil.isAssignable(float.class, Byte.class)); assertFalse("float = double", ClassUtil.isAssignable(float.class, double.class)); assertFalse("float = Double", ClassUtil.isAssignable(float.class, Double.class)); assertTrue("float = float", ClassUtil.isAssignable(float.class, float.class)); assertTrue("float = Float", ClassUtil.isAssignable(float.class, Float.class)); // double可以接受:double, float, long, int, byte, short, char assertFalse("double = boolean", ClassUtil.isAssignable(double.class, boolean.class)); assertFalse("double = Boolean", ClassUtil.isAssignable(double.class, Boolean.class)); assertTrue("double = char", ClassUtil.isAssignable(double.class, char.class)); assertTrue("double = Character", ClassUtil.isAssignable(double.class, Character.class)); assertTrue("double = int", ClassUtil.isAssignable(double.class, int.class)); assertTrue("double = Integer", ClassUtil.isAssignable(double.class, Integer.class)); assertTrue("double = long", ClassUtil.isAssignable(double.class, long.class)); assertTrue("double = Long", ClassUtil.isAssignable(double.class, Long.class)); assertTrue("double = short", ClassUtil.isAssignable(double.class, short.class)); assertTrue("double = Short", ClassUtil.isAssignable(double.class, Short.class)); assertTrue("double = byte", ClassUtil.isAssignable(double.class, byte.class)); assertTrue("double = Byte", ClassUtil.isAssignable(double.class, Byte.class)); assertTrue("double = double", ClassUtil.isAssignable(double.class, double.class)); assertTrue("double = Double", ClassUtil.isAssignable(double.class, Double.class)); assertTrue("double = float", ClassUtil.isAssignable(double.class, float.class)); assertTrue("double = Float", ClassUtil.isAssignable(double.class, Float.class)); } @Test public void locateClass() { assertThat(ClassUtil.locateClass(Logger.class), containsRegex("slf4j-api-\\S+\\.jar$")); assertThat(ClassUtil.locateClass(ClassUtilTests.class.getName()), containsAllRegex("^file:", "target/test-classes/$")); } private static class Inner { } }