简单比较 getName()、getCanonicalName()、getSimpleName() 的异同

xiaoxiao2021-02-28  92

public class Test0 { public static void main(String[] args) { System.out.println("******************************** 普通类 ****************************************"); TestClass testClass = new TestClass(); System.out.println(testClass.getClass().getName());// com.ershuai.stu.other.TestClass System.out.println(testClass.getClass().getCanonicalName());// com.ershuai.stu.other.TestClass System.out.println(testClass.getClass().getSimpleName());// TestClass System.out.println("\n******************************** 普通类 List ****************************************"); TestClass a1 = new TestClass(); TestClass a2 = new TestClass(); List<TestClass> appleList = new ArrayList<TestClass>(); appleList.add(a1); appleList.add(a2); System.out.println(appleList.getClass().getName());// java.util.ArrayList System.out.println(appleList.getClass().getCanonicalName());// java.util.ArrayList System.out.println(appleList.getClass().getSimpleName());// ArrayList System.out.println("\n******************************** 普通类 array - 有区别 ****************************************"); TestClass[] arrTestClass = new TestClass[] {}; System.out.println(arrTestClass.getClass().getName());// [Lcom.ershuai.stu.other.TestClass; System.out.println(arrTestClass.getClass().getCanonicalName());// com.ershuai.stu.other.TestClass[] System.out.println(arrTestClass.getClass().getSimpleName());// TestClass[] System.out.println("\n******************************** 内部类 - 有区别 ****************************************"); NTestClass ntestClass = new NTestClass(); System.out.println(ntestClass.getClass().getName());// com.ershuai.stu.other.Test0$NTestClass System.out.println(ntestClass.getClass().getCanonicalName());// com.ershuai.stu.other.Test0.NTestClass System.out.println(ntestClass.getClass().getSimpleName());// NTestClass System.out.println("\n************************************************************************"); System.out.println(Integer.class.getName());// java.lang.Integer System.out.println(Integer.class.getCanonicalName());// java.lang.Integer System.out.println(Integer.class.getSimpleName());// Integer System.out.println("\n************************************************************************"); System.out.println(int.class.getName());// int System.out.println(int.class.getCanonicalName());// int System.out.println(int.class.getSimpleName());// int } public static class NTestClass { } } 输出

******************************** 普通类 **************************************** com.ershuai.stu.other.TestClass com.ershuai.stu.other.TestClass TestClass ******************************** 普通类 List **************************************** java.util.ArrayList java.util.ArrayList ArrayList ******************************** 普通类 array - 有区别 **************************************** [Lcom.ershuai.stu.other.TestClass; com.ershuai.stu.other.TestClass[] TestClass[] ******************************** 内部类 - 有区别 **************************************** com.ershuai.stu.other.Test0$NTestClass com.ershuai.stu.other.Test0.NTestClass NTestClass ************************************************************************ java.lang.Integer java.lang.Integer Integer ************************************************************************ int int int

1、getCanonicalName顾名思义的正规的名字,与之对应的是getName

2、大部分情况下,getName和getCanonicalName没有什么不同的, 但是对于array和内部类就不一样了

3、对于数组:getCanonicalName是正规的(最后带有[]表示数组),getName是编译器的(前面带有[表示一维数组)

4、对于内部类:getCanonicalName是空,getName是带有$的

5、getSimpleName是简单的名字,是getName去掉了包名和$(内部类时候带有$)的余下的类自身的名字;getName带有包名和$(内部类时候带有$)

实际应用: hql的泛型查询

public <T> List<T> getRecords(Class<T> c,Date startDate,Date endDate){ StringBuilder hql = new StringBuilder("select t from "); hql.append(c.getCanonicalName()); hql.append(" t where t.statTime>=:startTime and t.statTime<:endTime "); Query query = sessionFactory.getCurrentSession().createQuery(hql.toString()); query.setParameter("startTime", startDate); query.setParameter("endTime", endDate); return query.list(); } }

转载请注明原文地址: https://www.6miu.com/read-51688.html

最新回复(0)