为了账号安全,请及时绑定邮箱和手机立即绑定

反射——Java高级开发必须懂的

难度入门
时长 1小时20分
学习人数
综合评分97
732人评价 查看评价
9.9 内容实用
9.7 简洁易懂
9.5 逻辑清晰
  • 编译和运行怎么区分?

    编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

    new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类

    通过动态加载类可以解决该问题,在运行时刻加载

  • 反射专题:

    class类的使用:万事万物皆对象,但是普通的数据类型类不是对象,但是有包装类,静态的成员不是对象,类是谁的对象?类是java.lang.Class类 的实例对象

    方法的反射,成员变量的反射,构造函数的反射,Java类加载机制

  • Class.forName("类的全称")

    不仅代表了类的类类型,还代表了动态加载类

    编译时刻 加载类是静态加载类

    运行时刻加载类是动态加载类

  • new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类

  • 类名.class   类的类类型    (teacher所说类名.class是类的字节码方便记忆)

    类类型.getName();//打印类的全称

    类类型.getSimpleName();//打印不带包名的类的名称

    基本数据类型,void关键字 都存在类类型

    获取类的信息,首先要获取类的类类型(三种方法)

    Class c=obj.getClass();        //obj是哪个子类的对象,c就是该子类的类类型

    //获取类的名称

    c.getName();

    //Method类,方法对象(一个成员方法就是一个method对象)

    getMethods()方法获取的是所有的public的函数,包括父类继承而来的

    getDeclaredMethods()获取的是所有该类自己声明的方法,不管访问权限

  • new 创建对象 是静态加载类 ,在编译时就需要加载所有的可能使用到的类

    动态加载类就是避免整个程序不能编译通过而影响正常的代码的执行

    具体方法:

    //动态加载类,在运行时加载

    Class c= Class.forName("类的全称");

    //通过类类型,创建该类对象

    OfficeAble oa=(OfficeAble)c.newInstance();

    oa.start();

    具体使用的时候再来实现OfficeAble接口

  • Class.forName("类的全称")

    不仅表示了类的类类型,还代表了动态加载类

    编译时加载类是静态加载类,运行时加载类是动态加载类

  • 静态成员基本数据类型不是对象

    类是java.lang.Class类的实例对象

  • Class c2=String.class;
    System.out.println(c2.getName());
    System.out.println(c2.getSimpleName());//不包含包名的类的名称

    结果:<!--此处有图片-->


    04:26
    看视频
  • JAVA-Reflect
    • Class类的使用

    • 动态加载类

    • 方法的反射

    • 成员变量、构造函数的反射

    • 方法反射的基本操作

    • 集合泛型是编译时的拦截,可以通过方法反射调用绕过编译

    • Java类加载机制


  • 方法必须由名称和参数列表来决定
    04:12
    看视频
  • Java通过反射了解集合泛型的本质

    知识点1:通过Class,Method认识泛型的本质,反射的操作都是编译之后的操作。

    集合泛型:防止错误输入的,只在编译阶段有效,编译之后该泛型就无效了。

    如果对一个集合使用String泛型,那么添加20,就会出错,通过创建两个ArrayList对象,一个加泛型,一个不加泛型,结果验证加泛型的类类型和不加泛型的类类型是相等的。

    结论:c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的。

    <!--此处有图片-->

    案例:通过方法的反射来操作,绕过编译,往集合中添加其他类型数据。

    <!--此处有图片-->


  • args 是 使用 命令行的参数列表 形如:  java  指定的程序名 参数 

    args[0]即 参数列表的 第一个参数 

    "Word".equals(args[0]) 即判断 第一个参数是否等于 word

  • Java方法反射的基本操作

    知识点1:方法反射可以完成的功能

    invoke(对象,参数列表):获取某个特定方法,方法对象的方法,它是有返回值的,如果方法返回值为void,则该方法返回值为null,如果方法有具体返回值,则该方法的返回值就是具体返回值

    getMethod(name):获取没有参数的public方法对象,name就是方法的名称,这是方法对象调用的invoke(A类对象)或者invoke(A类对象,new Object[]{})。

    getMethod(name,parameterTypes):获取public方法,name就是方法的名称,parameterTypes智能提示里是Class...parameterTypes代表是可变参数,所以这里可以传数组(new Class[]{int.class}),返回值类型是Method对象。

    getDeclaredMethod(name,paramterTypes):获得自己声明的方法,name就是方法的名称,parameterTypes智能提示里是Class...parameterTypes代表是可变参数,所以这里可以传数组(new Class[]{int.class},也可以是int.class这样),返回值类型是Method对象,没使用反射时可以直接使用A对象调用,使用反射就需要调用方法对象的invoke(obj,obj...parameter),obj为A对象,obj...parameter为Object[]{10,20})。

    案例:获取某一方法,再进行方法反射的操作。

    描述:创建一个MethodDemo1类,获取某一个方法对象,通过方法反射来操作MethodDemo1,并且提供一个A类,A类中有两个同名,但方法类型不一样的方法,。


    <!--此处有图片-->

    <!--此处有图片-->





  • 成员变量的反射和构造函数的反射

    知识点1:成员变量的反射

    java.lang.reflect.Field:成员变量也是对象,Field类封装了关于成员变量的操作。

    getFields():获取该类类型所有的public的成员变量信息,返回值为Field类型的数组。

    getDeclaredFields():获取所有自己声明的成员变量信息(不区分访问修饰符的限制),返回值为Field类型的数组。

    getType():获取成员变量类型的类类型,返回值类型为Class。

    getName():如果是成员变量类型调用该方法,则返回该类型的名字,如果是成员变量调用该方法,则返回成员变量名字。

    <!--此处有图片-->

    知识点2:构造函数的反射

    java.lang.Constructor:构造函数也是对象,Constructor中封装了构造函数的信息。

    getConstructors():类类型调用的方法,获取所有公有的构造方法,返回值类型为Constructor数组。

    getDeclaredConstructors():类类型调用的方法,获取所有自己声明的构造方法(不区分访问修饰符),返回值类型为Constructor数组。

    getName():Constructor类的方法,获取构造方法名(这里为类路径+构造方法名)。

    getParameterTypes():Constructor对象的方法,获取构造函数的参数列表,得到的是参数列表的类类型,返回值为Class类型数组。

    <!--此处有图片-->




  • 获取类的信息,

    1.通过参数(对象)获取类的类类型,然后获取类的信息

    09:09
    看视频
  • double.class  是数据类型的类类型

    Double.class 是封装类的类类型

    03:11
    看视频
  • int.class int 的类类型

    String.class string类的类类型  String类字节码,也就是编译后的字节码

    02:43
    看视频
  • 知识点1:类里面的标识符都有类类型。

    基本的数据类型对应的类类型

    例如:Class c1=int.class;这就是int的类类型,Class c2=String.class;String类的类类型,Class c3=double.class;和Class c4=Double.class;是完全不同的,Class c5=void.class,也就是类里面的声明的都有类类型。

    Class实例对象的方法:

    getName():获取类类型的具体名称。如果是类形式的,名称为类的全称,例如:c1的类类型名称为int,c2的类类型名称为java.lang.String。

    getSimpleName():不包含包名的类的名称。(例如:c2的类类型名称为String)

    getMethods():获取类的所有public函数(包括父类继承的函数),返回的是Method类型的数组。

    getDeclaredMethod():获取所有该类自己声明的方法,不问访问权限,返回的是Method类型的数组

    Method类:提供了getName()得到方法名。提供了getReturnType()得到方法返回值类类型(比如返回值为String,则函数返回的是String.class,如果是int,函数返回的是int.class),可以通过Class的getName返回返回值的名字而不带.class。提供了getParameterTypes()得到的是参数列表的类型的类类型(比如参数列表中存放的是int、int类型,则该方法返回的是int.class和int.class),这里也可以使用Class的getName返回参数列表的类型,而不带.class。

    <!--此处有图片-->

    知识点2:

    Class类的基本API操作

    案例:获取一个类的全部信息,包括类的成员函数、成员变量。

    描述:创建一个工具类名称为ClassUtil,并且有一个静态方法,参数为Object类型参数,首先获取该对象的类类型,这里使用第二种获取方式,传递的是哪个对象,Class对象就是该对象类类型(这个功能是由native声明的一个方法实现的,java中jni就是做本地方法的,该方法是由java来声明,用C语言来实现),万事万物皆对象,方法同样是对象。




首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
童鞋们,学习本课程前需要熟悉Java面向对象的思想,并能掌握Java IO输入输出流、集合和泛型等知识。可参考慕课网Java入门的一、二、三季以及我的文件我做主——Java IO流课程。
老师告诉你能学到什么?
1、能够理解并应用反射机制。 2、能够了解反射机制在集合泛型中的应用。 3、有利于更好的学习框架等Java高级技术。
意见反馈 邀请有奖 帮助中心 APP下载
官方微信