- 反射机制
- Class 类
- 获取Class类的几种方式
- 什么类型可以获取Class对象 ?
- 如何理解一个类型只有一个Class对象?
- Integer.class 与 Integer.TYPE 的区别
Java反射是在程序运行的过程中:
- 对任意的一个类,知道它的全类名,就可以获得这个类的属性或方法。
- 对任意的一个对象,都可以访问它的信息
动态获取类信息、动态调用对象方法的功能就叫做Java的反射机制
一个类被加载后,类的信息都会封装在Class对象里
一个类在内存中只有一个Class对象
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException {
//通过反射获取类的Class对象
Class c1 = Class.forName("com.company.reflect.test.User");
Class c2 = Class.forName("com.company.reflect.test.User");
Class c3 = Class.forName("com.company.reflect.test.User");
//一个类在内存中只有一个Class对象
//一个类被加载后,类的信息都会封装在Class对象里
System.out.println(c1 == c2);//true
System.out.println(c2 == c3);//true
}
}
Class 类
获取Class类的几种方式
- 类名.class
- Class.forName(“全类名”)
- 对象.getClass()
- **获取包装类的Class对象 : 包装类.TYPE **
- 获取父类Class : 子类class对象.getSuperClass()
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException {
//通过类名.class获取
Class c1 = User.class;
//通过forName获取
Class c2 = Class.forName("com.company.reflect.test.User");
//通过对象.getClass()获取
Class c3 = new User().getClass();
//获取的class对象都是同一个,因为一个类在jvm中只会创建一个class对象
System.out.println(c1 == c2 && c2 == c3);//true
//获取包装类型的class
//public static final Class TYPE = (Class) Class.getPrimitiveClass("int");
Class c4 = Integer.TYPE;
System.out.println(c4);
//获取父类的class
Class c5 = c1.getSuperclass();// int
System.out.println(c5); // class java.lang.Object
}
}
什么类型可以获取Class对象 ?
- 所有的类
- 接口
- 一维数组 这里一维和二维数组分开说,是因为一维数组和二维数组不是同一类型
- 二维数组
- 注解
- 枚举
- 基本类型包装类
- void
- Class
- 基本数据类型
public class Test2 {
public static void main(String[] args) {
Class c1 = Object.class; // 类
Class c2 = Comparable.class; //接口
Class c3 = char[].class; //一维数组
Class c4 = int[][].class; //二维数组
Class c5 = Override.class; //注解
Class c6 = Thread.State.class;//枚举类型
Class c7 = Integer.class; //基本类型包装类
Class c8 = void.class; //void
Class c9 = Class.class; //Class类的class对象
Class c10 = double.class; //基本类型
System.out.println(c1);//class java.lang.Object
System.out.println(c2);//interface java.lang.Comparable
System.out.println(c3);//class [C
System.out.println(c4);//class [[I
System.out.println(c5);//interface java.lang.Override
System.out.println(c6);//class java.lang.Thread$State
System.out.println(c7);//class java.lang.Integer
System.out.println(c8);//void
System.out.println(c9);//class java.lang.Class
System.out.println(c10);//double
}
}
如何理解一个类型只有一个Class对象?
数组也是引用类型,求数组的Class对象,只要是同一类型,不管创建了几个数组,长度是否相同,它们使用的都是同一个class对象
这里需要注意一维数组和二维数组的Class对象不同
public class Test {
public static void main(String[] args) {
int[] a = new int[10];
int[] b = new int[100];
int[][] c = new int[10][10];
//一维数组a,b都是int类型,长度不同,它们的class对象依然只有一个
System.out.println(a.getClass().hashCode());//460141958
System.out.println(b.getClass().hashCode());//460141958
System.out.println(c.getClass().hashCode());//1163157884
}
}
Integer.class 与 Integer.TYPE 的区别
System.out.println(Integer.class);//class java.lang.Integer System.out.println(int.class); //int System.out.println(Integer.TYPE); //int
- int.class是基本类型int的class对象
- Integer.TYPE是将int.class当做Integer的属性了
- Integer.class才是Integer本身的class对象



