黑马程序员——java中的反射

本文介绍了Java中的反射概念,通过三种方式获取类的字节码,包括使用`.class`、实例对象的`getClass()`和`Class.forName()`。反射的作用在于能够动态获取类的信息并操作,如构造方法、属性和方法。在Java框架开发中,反射技术用于在运行时操作未知类的方法和属性,以实现灵活的代码调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- android培训java培训、期待与您交流! ----------

1 反射的概念

           反射就是把一个java类中的各种成分映射成相应的java类。

          例如,一个java类用一个Class类来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类来表示。

2 获取一个类的字节码的三种方式:

       例如获取String类的字节码

         1  String.class   类名加上”.class“

         2  new String().getClass()  实例对象的getClass方法

         3  Clasa.forName("java.lang.String")

3 反射的作用

        在得到了一个类的字节码实例对象之后,就可以对这个实例对象进行操作,来获取本来类中的一些属性,方法和信息。

       1 得到String类的构造方法,只能获取参数为public的构造函数

 Class clazz = String.class;
        //获得全部的构造函数
        Constructor[] constructors = clazz.getConstructors();
        //获取参数为StringBuilder的构造函数
        Constructor constructor = clazz.getConstructor(StringBuilder.class);//StringBuilder 线程不同步的

        在得到String类的构造函数之后就可以进行创建String类的实例对象

 //通过反射的方式创建String对象
        String s = (String)constructor.newInstance(new StringBuilder());
    2 得到String类的方法

//得到全部的方法
        Method[] methods = clazz.getMethods();
        //获取参数类型为int的charAt方法
        Method method = clazz.getMethod("charAt",int.class);
           通过反射的方式来,调用方法

method.invoke(new String("abcd"), 1)

    3  获得string类的属性

 //得到全部的属性
        Field[] fields = clazz.getFields();
        //得到 CASE_INSENSITIVE_ORDER这个属性
        Field field = clazz.getField("CASE_INSENSITIVE_ORDER");
     然后就可以获得属性的值了

field.get(String.class)

     然后还有一些别的方法,比如getPackage,getName等,还有一些判断的方法,

例如:

    

clazz.getName();//得到类的名字
        clazz.getPackage();//得到类在哪个包下面
        clazz.isArray();//判断是不是一个数组
        clazz.isEnum();//判断是不是一个枚举类型
        clazz.isPrimitive();//判断是不是原始类型,原始类型包括boolean,char,byte,short,int,float,double,long八个

    每个类的字节码对象在内存中只有一份,也就是说String.class == new String("") 但是,int.class跟Integer.class是不相等的,因为int是一个原始类型,而Integer是一个包装类。

同样的道理,另外的7个原始类型也一样。在Integer类中有一个TYPE属性,int.class 跟Integer.TYPE是相等的。

    当反射作用于数组类型的时候,具有相同的数据类型和形同的维数的数组,在内存中是同一份字节码。

如果方法接受的参数类型是一个数组,那么在用invoke实现这个方法的时候,要将数组再次包装,以为在jdk1.4中没有可变参数这个特性

 int[] a = new int[5];
        int[] b = new int[10];
        int[][] c = new int[5][5];
        String[] d = new String[5];
        
        System.out.println(int.class == Integer.class);//false
        System.out.println(int.class == Integer.TYPE);//true
        
        Class cls1 = c.getClass();
        Class cls2 = d.getClass();
        System.out.println(a.getClass() == b.getClass());//true
        System.out.println(a.getClass() == cls1);//false
        System.out.println(a.getClass() == cls2);//false


4  反射在框架的应用

           java类用两种应用,

             工具类:被调用的类,调用工具类来完成一些操作

             框架:调用别人的类。在写框架之前不知道别的类的存在,所以在框架中就需要用到反射,来将别人类中的方法或者属性获取出来。

         例如:在写框架时,并不知道后面会有哪些类,就像在盖房子时,我们不知道用户要安装什么样的门窗,所以在搭框架时就无法new出门窗的对象

                     只能用反射来创建和操作。






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值