Java获取类的全限定类名
在Java中,每个类都有一个唯一的全限定类名(Fully Qualified Class Name),它用于标识该类在整个Java应用程序中的位置。全限定类名由包名和类名组成,使用点号将它们连接起来。例如,java.lang.String
是String
类的全限定类名。
在某些情况下,我们需要获取一个类的全限定类名,比如在日志记录、反射和动态代理等场景下。本文将介绍几种获取类的全限定类名的方法,并提供相应的Java代码示例。
方法一:使用getClass().getName()
每个Java对象都有一个getClass()
方法,它返回该对象所属的类的Class
对象。通过调用getName()
方法,我们可以获取该类的全限定类名。
public class ExampleClass {
public static void main(String[] args) {
ExampleClass example = new ExampleClass();
String className = example.getClass().getName();
System.out.println(className);
}
}
上述代码将输出:
ExampleClass
该方法对于已知对象的类非常有用。但是,如果我们只有类的名称而没有实例,或者需要获取静态成员的全限定类名,则需要使用其他方法。
方法二:使用Class.forName()
Class.forName()
是一个用于加载类的方法。通过传递类的名称作为参数,我们可以获取该类的Class
对象,进而获取全限定类名。
public class ExampleClass {
public static void main(String[] args) throws ClassNotFoundException {
String className = "java.lang.String";
Class<?> clazz = Class.forName(className);
String fullClassName = clazz.getName();
System.out.println(fullClassName);
}
}
上述代码将输出:
java.lang.String
这种方法适用于我们只知道类的名称,但不知道其包名的情况。需要注意的是,Class.forName()
方法抛出ClassNotFoundException
,因此需要进行异常处理或抛出异常。
方法三:使用Class.getCanonicalName()
Class
类还提供了一个getCanonicalName()
方法,它返回该类的规范名称,即全限定类名。与getName()
方法不同,getCanonicalName()
方法对于数组和内部类也能正确返回全限定类名。
public class ExampleClass {
public static void main(String[] args) {
String className = "java.lang.String[]";
Class<?> clazz = String[].class;
String fullClassName = clazz.getCanonicalName();
System.out.println(fullClassName);
}
}
上述代码将输出:
java.lang.String[]
方法四:使用this.getClass().getCanonicalName()
如果我们需要在类的内部获取自身的全限定类名,可以使用this.getClass().getCanonicalName()
方法。
public class ExampleClass {
public void printClassName() {
String className = this.getClass().getCanonicalName();
System.out.println(className);
}
public static void main(String[] args) {
ExampleClass example = new ExampleClass();
example.printClassName();
}
}
上述代码将输出:
ExampleClass
总结
通过以上四种方法,我们可以轻松地获取类的全限定类名。无论是已知对象的类、类的名称、静态成员,还是在类的内部获取自身的全限定类名,这些方法都能满足不同的需求。
如果我们需要在代码中频繁获取类的全限定类名,建议将获取全限定类名的逻辑封装到一个工具类中,以便于复用。例如:
public class ClassNameUtils {
public static String getFullClassName(Object object) {
return object.getClass().getName();
}
public static String getFullClassName(String className) throws ClassNotFoundException {
Class<?> clazz = Class.forName(className);
return clazz.getName();
}
// 其他方法...
}
这样,我们就可以在需要获取类的全限定类名时,只需要调用相应的方法,避免重复的代码。
类关系图
下面是一个示例的类关系图,展示了ExampleClass
、String
和Object
之间的关系:
erDiagram
ExampleClass ||..|> Object : extends
ExampleClass -- String : uses