Java获取类的全限定类名

在Java中,每个类都有一个唯一的全限定类名(Fully Qualified Class Name),它用于标识该类在整个Java应用程序中的位置。全限定类名由包名和类名组成,使用点号将它们连接起来。例如,java.lang.StringString类的全限定类名。

在某些情况下,我们需要获取一个类的全限定类名,比如在日志记录、反射和动态代理等场景下。本文将介绍几种获取类的全限定类名的方法,并提供相应的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();
    }
    
    // 其他方法...
}

这样,我们就可以在需要获取类的全限定类名时,只需要调用相应的方法,避免重复的代码。

类关系图

下面是一个示例的类关系图,展示了ExampleClassStringObject之间的关系:

erDiagram
    ExampleClass ||..|> Object : extends
    ExampleClass -- String : uses

参考链接