Java编程:如何将Object对象转换成指定的Class对象

在编写Java时将Object转换为指定类型的Class对象是经常进行的一个常规操作,那Java中Object对象是如何转换为制定的Class对象的呢?

将Object实例转换为指定类型的Class实例

这种转换涉及到类型转换(如(MyType) myObject)或者通过反射机制(Class.cast(Object))来进行。

先定义一个简单的类和一个转换示例:

class Animal {
    void eat() {
        System.out.println("This animal eats.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Object myDog = new Dog();
        if (myDog instanceof Dog) {
            Dog dog = (Dog) myDog;
            dog.bark();
            dog.eat();
        } else {
            System.out.println("Not a dog!");
        }
        try {
            Dog anotherDog = (Dog) Class.forName("Dog").cast(myDog);
            anotherDog.bark();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

上面的Class.forName("Dog")会抛出ClassNotFoundException,因为"Dog"不是完全限定的类名。正确的方式是使用完全限定的类名,如"com.example.Dog",且这通常不是动态类型转换的推荐方式。

Class.forName("Dog").cast(myDog)这种用法实际上是不推荐的,因为cast方法并不比直接类型转换(Dog) myDog提供更多功能,并且Class.forName需要完全限定的类名。

获取特定类型的Class对象

这种转换可以通过.class语法或Class.forName(String className)方法来实现

public class Main {
    public static void main(String[] args) {
        Class<Dog> dogClass = Dog.class;
        System.out.println(dogClass.getName());

        try {
            Class<?> cls = Class.forName("com.example.Dog");
            System.out.println(cls.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

假设Dog类在com.example包下,Class.forName方法需要完全限定的类名,并且会抛出ClassNotFoundException,如果找不到指定的类。此外,由于Class.forName返回的Class<?>是一个通配符类型的Class对象,因此如果你知道具体的类型,最好使用.class语法来避免不必要的类型转换。

我的笔记