Class的getName、getSimpleName与getCanonicalName的区别

一、getName  除了数组外,其他的类都是输出类全名

String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

1、此类对象表示的是非数组类型的引用类型,

返回该类的二进制名称,Java Language Specification, Second Edition 对此作了详细说明。

2、此类对象表示一个基本类型或 void

返回的名字是一个与该基本类型或 void 所对应的 Java 语言关键字相同的 String。

3、此类对象表示一个数组类

名字的内部形式为:表示该数组嵌套深度的一个或多个 ‘[‘ 字符加元素类型名。元素类型名的编码如下:

Element Type Encoding
boolean Z
byte B
char C
class or interface Lclassname;
double D
float F
int I
long J
short S

例如:

System.out.println(String.class.getName());
System.out.println(DataBase.class.getName());
System.out.println((new DataBase[3][1]).getClass().getName());
System.out.println((new int[3][4][5][6][7][8][9]).getClass().getName());  

java.lang.String
cn.database.DataBase
[[Lcn.database.DataBase;
[[[[[[[I

二、getSimpleName  输出类的简单名(不包含包名)

返回源代码中给出的底层类的简称。如果底层类是匿名的则返回一个空字符串。

数组的简称即附带 "[]" 的组件类型的简称。特别地,组件类型为匿名的数组的简称是 "[]"。

System.out.println(String.class.getSimpleName());
System.out.println(DataBase.class.getSimpleName());
System.out.println((new DataBase[3][1]).getClass().getSimpleName());
System.out.println((new int[3][4][5][6][7][8][9]).getClass().getSimpleName());

String
DataBase
DataBase[][]
int[][][][][][][]

三、getCanonicalName 输出类全名

返回 Java Language Specification 中所定义的底层类的规范化名称。如果底层类没有规范化名称(即如果底层类是一个组件类型没有规范化名称的本地类、匿名类或数组),则返回 null。

System.out.println(String.class.getCanonicalName());
System.out.println(DataBase.class.getCanonicalName());
System.out.println((new DataBase[3][1]).getClass().getCanonicalName());
System.out.println((new int[3][4][5][6][7][8][9]).getClass().getCanonicalName());

java.lang.String
cn.database.DataBase
cn.database.DataBase[][]
int[][][][][][][]

时间: 2024-08-05 17:44:16

Class的getName、getSimpleName与getCanonicalName的区别的相关文章

java 反射机制-获取对应class信息

1 package reflection; 2 3 public class User { 4 public String name; 5 protected int age; 6 String address; 7 private String sex; 8 9 public User() { 10 super(); 11 } 12 13 public User(String name, int age, String sex) { 14 super(); 15 this.name = nam

Reflect Java反射机制

// 参考:http://blog.csdn.net/stevenhu_223/article/details/9286121 最近发现好多框架底层的实现与Java的reflect和cglib有关,看过原理后找了几篇经典的文档,以供后来复习使用 前言:我们知道,类和类的成员变量及方法都是要求有权限控制的(public.protected.private):而当类中的信息封装为私有时,外部对该类中私有的信息是没有访问权限的,也就是说当该类里的内容信息均受private权限控制时,外部想要获取和处理

Java反射机制知识点

反射机制 本文章参照:魔乐java视频教程讲解,感谢 1.认识反射 反射之中包含一个"反"的概念,所以就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是"反"指的是通过对象找到类 package cn.test; class Person{};   // 定义一个Person类 public class ReflectDemo { public static void main(Str

kotlin嵌套类

就是类中定义类 package loaderman.demo class Outer { var name: String = "name" inner class inner {//inner关键字获取外部类的实例引用 fun getName(): String = name } class Ha{ fun go()=3 } } package loaderman import loaderman.demo.Outer fun main(arg: Array<String>

java getCanonicalName getSimpleName和getName的区别和用法

接口: Java代码   package com.test; public interface Fruit { } 一个实现类: Java代码   package com.test; public class Apple implements Fruit { } 基本测试类: Java代码   package com.test; import java.util.ArrayList; import java.util.List; public class TestName { public st

class.getName()和class.getSimpleName()的区别

根据API中的定义: Class.getName():以String的形式,返回Class对象的"实体"名称: Class.getSimpleName():获取源代码中给出的"底层类"简称. public class Main { private static final String TAG1 = Main.class.getName(); private static final String TAG2 = Main.class.getSimpleName();

java线程学习-Thread.currentTread().getName()和this.getName()的区别

很久没有写java程序了,由于为了改变目前的状况,打算花两天时间学习一下java的线程开发和高并发. 线程开发使用thread类,或者runnable接口,而且thread类也是实现了runnable接口的. 先来个小甜点作为开始,如下为创建多个线程,并且同时处理. package firstThreadStudy; public class MyThread extends Thread { public MyThread(){ System.out.println("MyThread cur

python threading.current_thread().name和.getName()有什么区别

今天学到python多线程这块,想显示当前线程是主线程还是子线程.网上一搜,有个方法叫 1 threading.current().name 定海偶然 但是发现,同样的threading.current_thread()后面不仅仅有.name属性,而且还有.getName()方法.但是 这2个写法最后得出的结果却是一样的. 那么,2者区别在哪里呢? 1 import threading 2 import time 3 4 def run(arg): 5 print("running sub th

Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别

首先要明白 this.XXX 的使用场景  使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但是使用this调用getName()方法只能在本类中,而不能在其他类中,更不能在Runnable接口中,所以只能使用Thread.currentThread().getName()获取线程的名称,否则会出现编译时异常. Thread.currentThread().getName()  ,对象实例