做网站java好还是.net好/网络推广经验
Java中Class类名的获取有多个方法,如果错用可能得不到预期结果,我们拿出来简单对比一下:
getName()
以字符串的形式返回Class全名,包括包名+类名getSimpleName()
仅仅返回类名,不返回包名getCanonicalName()
Java SE Specifications中定义的Class全名,包括包名和类名
JavaSpec中的Class名与getName的有何不同?
getName()
返回的是Class在JVM中的名字,而getCanonicalName()
返回的Specifications名字可读性更友好,对于普通对象类两者没有区别,主要区别在于JVM内建类型上:
- 例如数组:
int[]
getName()
:[I
getCanonicalName()
:int[]
- 二维数组:
byte[][]
getName()
:[[B
getCanonicalName()
:byte[][]
- 内部类:
getName()
:com.my.pkg.Main$Demo1$Demo2
getCanonicalName()
:com.my.pkg.Main.Demo1.Demo2
Demo
package com.my.sample;public class ClassNameSample {public ClassNameSample() {InnerClass innerClass = new InnerClass();innerClass.className();}public static void main(String[] args) {System.out.println("\nOuter Class");System.out.println(" Name - " + ClassNameSample.class.getName());System.out.println(" Simple - " + ClassNameSample.class.getSimpleName());System.out.println(" Canonical - " + ClassNameSample.class.getCanonicalName());System.out.println("Outer Anonymous Class");new Object() {public void className() {System.out.println(" Name - " + getClass().getName());System.out.println(" Simple - " + getClass().getSimpleName());System.out.println(" Canonical - " + getClass().getCanonicalName());}}.className();//Inner classnew ClassNameSample();//Static inner classnew StaticInnerClass().className();}private class InnerClass {public void className() {System.out.println("\nInner Class");System.out.println(" Name - " + getClass().getName());System.out.println(" Simple - " + getClass().getSimpleName());System.out.println(" Canonical - " + getClass().getCanonicalName());System.out.println("Inner Anonymous Class");new Object() {public void className() {System.out.println(" Name - " + getClass().getName());System.out.println(" Simple - " + getClass().getSimpleName());System.out.println(" Canonical - " + getClass().getCanonicalName());}}.className();}}private static class StaticInnerClass {public void className() {System.out.println("\nStatic Inner Class");System.out.println(" Name - " + getClass().getName());System.out.println(" Simple - " + getClass().getSimpleName());System.out.println(" Canonical - " + getClass().getCanonicalName());System.out.println("Static Inner Anonymous Class");(new Object() {public void className() {System.out.println(" Name - " + getClass().getName());System.out.println(" Simple - " + getClass().getSimpleName());System.out.println(" Canonical - " + getClass().getCanonicalName());}}).className();}}
}
运行结果:
Outer ClassName - com.my.sample.ClassNameSampleSimple - ClassNameSampleCanonical - com.my.sample.ClassNameSample
Outer Anonymous ClassName - com.my.sample.ClassNameSample$1Simple - Canonical - nullInner ClassName - com.my.sample.ClassNameSample$InnerClassSimple - InnerClassCanonical - com.my.sample.ClassNameSample.InnerClass
Inner Anonymous ClassName - com.my.sample.ClassNameSample$InnerClass$1Simple - Canonical - nullStatic Inner ClassName - com.my.sample.ClassNameSample$StaticInnerClassSimple - StaticInnerClassCanonical - com.my.sample.ClassNameSample.StaticInnerClass
Static Inner Anonymous ClassName - com.my.sample.ClassNameSample$StaticInnerClass$1Simple - Canonical - null
总结
- 匿名类的
simple name
是空字符串、canonical name
是null
name
既不会为null也不会为空,永远有返回- 内部类的静态与否无差别