获取Class对象的三种方法
- 使用 Class 类的 forName 静态方法;
- 直接获取某一个对象的 class;
- 调用某个对象的 getClass() 方法
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class c1 = Class.forName("reflect.Employee"); // 第1种,forName 方式获取Class对象
Class c2 = Employee.class; // 第2种,直接通过类获取Class对象
Employee employee = new Employee("小明", "18", "写代码", 1, "Java攻城狮", 100000);
Class c3 = employee.getClass(); // 第3种,通过调用对象的getClass()方法获取Class对象
if (c1 == c2 && c1 == c3) { // 可以通过 == 比较Class对象是否为同一个对象
System.out.println("c1、c2、c3 为同一个对象");
System.out.println(c1); // class reflect.Employee
}
}
}
Java中有8中基本类型:byte、short、int、long、float、double、boolean、char,这8种类型的变量是不能通过obj.getClass()方法直接获取其Class对象的,而它们分别对应8种
包装类型:Byte、Short、Integer、Long、Float、Double、Boolean、Character,这8种包装类型的变量是可以通过obj.getClass()方法获得其Class对象的。
注意String不是基本类型,它的底层由char[]实现,String类型的变量可通过obj.getClass()方法获得其Class对象。
例如一个int类型的变量,是无法调用.getClass()方法的:
而将其转变为Object类型后,可以发现它被自动转成了Integer类型。
public static void main(String[] args) {
int intobj = 0;
Object obj = intobj;
System.out.println(obj.getClass().getName());//打印结果为java.lang.Integer
}
根据类型名获取类型对象的正确方法为:
public Class getArgTypeClass(String typeStr) {
switch (typeStr) {
case "byte":
return byte.class;
case "short":
return short.class;
case "int":
return int.class;
case "long":
return long.class;
case "float":
return float.class;
case "double":
return double.class;
case "boolean":
return boolean.class;
case "char":
return char.class;
default:
return typeStr.getClass();
}
}
参考:java反射机制详解