在编写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语法来避免不必要的类型转换。
