栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java的反射机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的反射机制

Java反射
  • 反射机制
  • 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类的几种方式
  1. 类名.class
  2. Class.forName(“全类名”)
  3. 对象.getClass()
  4. **获取包装类的Class对象 : 包装类.TYPE **
  5. 获取父类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对象 ?
  1. 所有的类
  2. 接口
  3. 一维数组 这里一维和二维数组分开说,是因为一维数组和二维数组不是同一类型
  4. 二维数组
  5. 注解
  6. 枚举
  7. 基本类型包装类
  8. void
  9. Class
  10. 基本数据类型
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对象
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992132.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号