Java的getCanonicalName和getName

Java中获取类名主要有三个方法供我们使用:getName(), getCanonicalName() 和getSimpleName().

举个例子看下它们的区别。比如如下类:

package my;

public class ExternalClassConfig {

	private String desc;

	//    ...
    
    public static class InternalConfig {
    	//      ...
    }

    
}
类里面含有个内部类。

然后我们调用类的上面三个方法看下结果:

	@Test
	public void testclassName() {
		System.out.println();
		System.out.println("方法                                值");
		System.out.println("getName            " + ExternalClassConfig.class.getName());
		System.out.println("getCanonicalName   " + ExternalClassConfig.class.getCanonicalName());
		System.out.println("getSimpleName      " + ExternalClassConfig.class.getSimpleName());
		
		System.out.println("getName            " + InternalConfig.class.getName());
		System.out.println("getCanonicalName   " +InternalConfig.class.getCanonicalName());
		System.out.println("getSimpleName      " +  InternalConfig.class.getSimpleName());
		
		System.out.println();
	}

输出结果如下:

方法               值
getName            my.ExternalClassConfig
getCanonicalName   my.ExternalClassConfig
getSimpleName      ExternalClassConfig
getName            my.ExternalClassConfig$InternalConfig
getCanonicalName   my.ExternalClassConfig.InternalConfig
getSimpleName      InternalConfig

这里,getName()返回的是虚拟机里面的class的表示,而getCanonicalName()返回的是更容易理解的表示。其实对于大部分class来说这两个方法没有什么不同的。但是对于array或内部类来说是有区别的。
另外,类加载(虚拟机加载)的时候需要类的名字是getName。

再看数组:

	@Test
	public void testclassName4Array() {
		String [] ss = new String[]{
			"zw", "zz"
		};
		System.out.println();
		System.out.println("方法                                值");
		System.out.println("getName            " + ss.getClass().getName());
		System.out.println("getCanonicalName   " + ss.getClass().getCanonicalName());
		System.out.println("getSimpleName      " + ss.getClass().getSimpleName());
		
		System.out.println();
	}
输出结果:

方法                 值
getName            [Ljava.lang.String;
getCanonicalName   java.lang.String[]
getSimpleName      String[]
不习惯这种表示可能觉得有点怪。首先 ‘[’ 表示数组,一个代表一维数组,比如 '[[' 代表二维数组。之后 'L' 代表类描述符,最后分号表示结束。

这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。有兴趣的话可以自己学习下。


  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中的getClass()方法是Object类中定义的一个方法,它可以返回一个对象的实际类型。具体来说,getClass()方法返回一个Class对象,该Class对象包含了实际类型的相关信息,包括类名、方法名、构造函数等。 例如,如果有一个对象obj,我们可以通过调用 obj.getClass() 方法来获取该对象的实际类型的Class对象。代码示例: ``` Object obj = new Object(); Class<?> cls = obj.getClass(); System.out.println(cls.getName()); ``` getName()方法是Class类中的一个方法,它返回该类或者接口的名称(不包括包名)。如果该类或者接口是数组类型,则返回的是数组元素类型的名称。 例如,在上面的代码中,我们可以通过调用 cls.getName() 方法来获取 obj 对象的实际类型的名称。代码示例: ``` Object obj = new Object(); Class<?> cls = obj.getClass(); System.out.println(cls.getName()); ``` 输出结果为: ``` java.lang.Object ``` 如果我们定义了一个类,例如: ``` public class MyClass { // ... } ``` 我们可以通过如下代码获取该类的Class对象,并调用 getName() 方法来获取该类的名称: ``` Class<?> cls = MyClass.class; System.out.println(cls.getName()); ``` 输出结果为: ``` MyClass ``` 需要注意的是,如果我们定义的类在某个包中,那么 getName() 方法返回的结果中将包含包名,例如: ``` package com.example; public class MyClass { // ... } Class<?> cls = com.example.MyClass.class; System.out.println(cls.getName()); ``` 输出结果为: ``` com.example.MyClass ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值