黑马程序员——java基础增强反射的学习

本文深入探讨Java反射技术的概念、Class类、Constructor类、Field类、Method类以及数组的反射,通过实例代码演示反射在Java开发中的核心作用,包括获取类信息、构造方法、成员变量和方法的使用,以及如何利用反射解决未知类调用的问题。

                               ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

     java基础学习进行到最后的部分,有些激动,除此之外,听老师讲课的部分,由于习惯性毕老师的讲解,听张老师的有些很不习惯。也因此听了3遍才学完反射的部分,比较难,而且做做笔记方面,比较混乱,内容也较少,主要还是理解为主吧,以后还要继续加强反射的学习。

反射:

一,概念

      框架要用到反射技术。反射就是把java类中的各种成分映射成相应的java类。
      或者说是java中获取指定类中的所有内容, 字节码就是个对象。

Class类

   概念:众多的java类就是Class类。
         Class对象封装了一个java类中的成员变量,成员方法,类名等。
   反射的步骤:1,先获得Class对象,也就是获得各字节码对应的实例对象。
               2,获得该类的方法,内容。
   如何获取各字节码对应的实例对象:1:类名.class   
                  2:对象调用getClass()可以获取该对象的字节码。
                  3:Class.forName(类名):返回字节码--反射主要
    九个预定义的Class:1,基本数据类型,void类型的void.calss.
                     2,基本类型:int.calss==Intger.TYPE
   方法:isPrimitive()是否为基本类型的字节码。
   注意:数组不是基本类型。
   数组类型的实例对象:Class.isArray.
   举例:Method代表方法这个类型,method对象代表一个具体的方法。   

Constructor类:

   概念:代表某个类的一个构造方法:getConstructors--得到某个类所有的构造方法。
         也可以得到某一个getConstructor构造方法。
  实例对象的创建:

      Constructor constructor =         Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

      String str = (String)constructor.newInstance(new StringBuffer("abc"));

   方法:newInstance()---构造出一个实例对象

Field类:

   概念:某一个类的成员变量。

   Field fieldY =ptl.getClass().getField("y");

   FieldY不是对象身上的变量,而是类上的。用它取对应对象上的值。

   方法:getDeclareField()可以获取私有。看不见

          setAccessible(true);暴力反射,看见了拿不到。

练习:

public class ReflectPoint {  
    String x;  
    String y;  
    public String str1 = "basketball";  
    public String str2 = "ball";  
    public ReflectPoint(String x, String y) {  
        super();  
        this.x = x;  
        this.y = y;  
    }  
    @Override  
    public String toString() {  
        return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + "]";  
    }  
}  
  
public class Test {  
  
    public static void main(String[] args) throws Exception {  
        // TODO Auto-generated method stub  
        ReflectPoint rp = new ReflectPoint(String.valueOf(3), String.valueOf(4));  
  
        Field[] fields = ReflectPoint.class.getFields();  
        for (Field field : fields) {  
            if (field.getType() == String.class) {  
  
                String str = (String) field.get(rp);  
                System.out.println(str.replace("b", "a"));  
            }  
        }  
    }  
}  


注意:同一个字节码可以用==

Method类

   不是对象的方法,是一个类上的方法,可以调用对象。

   得到类中的一个方法:

   Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);

   调用方法:

   通常方式:System.out.println(str.charAt(1));

   反射方式:System.out.println(charAt.invoke(str, 1));

   方法:getMethods(),getMethod("方法名",参数.class)

         注意:参数类型就是Class对象。

   其它:如果传递给Method对象的invoke()方法的第一个参数为null,说明Method对象对应的是一个静态方法

数组的反射:

   1、具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象。

   2、代表数组的Class实例对象的getSupperClass()方法返回的父类为Object类对应的Class。

   3、基本类型的一维数组可以当做Object类型来使用,不能当做Object[]来使用;

     非基本类型的一维数组既可以当做Object类型来使用,也可以当做Object[]使用。

   Arrays.aslist

   Array工具类用于完成对数组的反射操作。

         Array.getLength(obj);//获取数组的长度

   Array.get(obj,x);//获取数组中的第x个元素。

框架:

    反射类主要是用来做框架。

    框架和工具类的区别:工具类被用户类调用,而框架是调用用户提供的类。

    解决的核心问题:对未知的东西实现用。

    另外:框架无法知道要被调用的类名,所以在程序中无法直接new其某个类的实例对象,

          而要用反射来做。

    举例:卖房子。

    框架项目完成效率高。

    配置文件:config.properties


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值