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

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

难度入门
时长 1小时20分
学习人数
综合评分97
736人评价 查看评价
9.9 内容实用
9.7 简洁易懂
9.5 逻辑清晰
  • 反射的操作时编译之后的操作

    两个不同对象

    Array list =new ArrayList();

    Array<String> list2 =new ArrayList<String>(); //使用泛型约束

    Class c1=list.getClass();

    Class c2=list2.getClass();

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

    Java中集合的泛型,是防止输入错误,只在编译阶段有效

    绕过编译就无效了

    利用方法反射来操作,绕过编译



    06:44
    看视频
  • 方法的名称和方法的参数列表才能唯一决定某个方法。

    方法反射的操作

    利用反射机制调用方法

    method.invoke(对象,参数列表) 如果没有返回值,返回null,如果有返回值返回具体的返回值,需要从Object强制转换。参数列表可以是new Object[](){object,object}; 获直接传参数 object,object。

    method.invoke((对象) 调用没有参数方法。调用时使用getMethod(对象)。

    getMethod(name)获取没有参数的方法,返回Method对象。

    getMethod(name,parameterTypes) 获取有参数public方法包括继承的方法,name就是方法的名称,返回Method对象。提示Class...parameterTypes代表可变参数,可以是new Class[](){int.class,int.class};或者直接int.class,int.class。

    getDeclaredMethod(name,paramterTypes):获得所有自己声明的方法,name就是方法的名称。Class...parameterTypes代表可变参数,可以是new Class[](){int.class,int.class};或者直接int.class,int.class。

    08:32
    看视频
  • 成员变量也是对象

    java.lang.reflect.Field 封装了关于成员变量的操作

    getFields()方法获取的是所有的public的成员变量的信息

    getDeclaredFields()获取的是该类自己声明的成员变量的信息

    构造函数也是对象

    java.lang.Constructor中封装了构造函数的信息

    getConstructors()获取所有的public的构造函数

    getParameterTypes()获取参数列表的类类型





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

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

    void关键字 都存在类型

    Method类

    一个成员方法就是一个Method对象

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

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

    getReturnType();获得方法返回值类的类类型

    getParameterTypes();获得参数列表的类类的类类型 Class[]

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

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

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

    描述:在 main 函数中,有一个 String args[] 参数,这就表示在执行某 .class 文件时,可以对 main 函数传字符串参数(例如:命令行中:java OfficeBetter Excel,传给主函数的参数就是Excel,如果传多个参数,参数用空格隔开),Office类中使用了两个类(没有提供这两个类),并调用其相应的方法,然后进行编译报错,提示找不到这两个类,我们只提供了Word类和相应方法,并对它进行编译(这是因为只使用Word的功能),这时候再对Office这个类进行编译,这时候只报Excel找不到的错误,现在核心问题是只想使用Word,而不使用Excel这个类,但是报错(这样就不能运行,导致不能使用Word的功能),因为new 对象是静态加载类的方式,在编译时刻就需要加载所有可能使用到的类,但实际应用希望用到哪个类加载哪个类,这样就不会在编译时报错,并且可以运行,所以可以通过动态加载类来解决该问题,通过Class.forName(args[0])动态加载这个类的Class实例对象,通过传入一个类的路径,即使没有这个类,编译时刻也不会报错,但运行时刻会报错,紧接着就可以通过Office的类类型创建Word对象,如果强制转换为Excel类型,但是加载时却是Word类,就可能发生错误,这时就需要给Word和Excel指定一个标准,也就是创建一个接口,并声明相应方法,并且让Word和Excel实现这个接口,如果传入的参数是Excel,只需要再创建一个Excel并实现该接口,这样就不用在主程序中修改类型了,实际应用中功能类通常使用动态加载类。

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

    Class类的实例对象表示方式:

    1、隐含的静态成员变量class

    Class c1=Foo.class;

    2、类的getClass方法

    Foo foo1=new Foo();

    Class c1=foo1.getClass();

    c1,c2表示了Foo类的类类型(class type)

    不管c1,c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象

    3、Class.forName("类全名")

    Class c3=Class.forName("com.Foo");

    通过类类型创建该类的对象实例

    Foo foo=(Foo) c1.newInstance();

    注意:如果c1是A类的Class实例,则创建的是A类的对象,如果是B类的Class实例,则创建的是B类的对象,并且需要做强制类型转换。

    默认需要该类有无参数的构造方法。


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

    知识点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类型数组。

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


  • 今天的笔记

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

    04:14
    看视频
    1. 静态成员、普通数据类型不是对象。类是java.lang.Class的对象。

    2. 任何一个类都是Class的实例对象,这个实例对象有三种表示方式

      第一种表示方式    任何一个类都有一个隐含的静态成员变量class

          Class c1=Foo.class;

      第二种表达方式    已经知道该类的对象通过getClass方法

          Class c2=foo1.getClass();

    第三种表达方式

        Class c3=null;

       c3=Class.forName("路径   包.类名");

    c1,c2,c3表示了Foo类的类类型(class type)

    我们完全可以通过类的类类型创建该类的对象实例

    Foo foo=(Foo)c1.newInstance();

  • new是静态加载类,在编译的时候把可能用到的类全都加载进来。

  • java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了


    总结:反射可以绕过编译

  • 方法的反射

    Class c=a1.getClass()

    获取方法

    Method m=c.getDeclaredMethod(name,parameterTypes);

    方法的反射操作

    m.invoke(obj,args);


    对于无参的方法

    Method m2=c.getMethod("print");

    m2.invoke(a1,new Object[]{});


  • 构造函数也是对象

    java.lang.Constructor中封装了构造函数的信息

    getConstructors获取所有的public的构造函数

    getDeclaredConstuctors得到所有的构造函数


    获取构造函数的参数列表  得到的是参数列表的类类型

    Class[] paramTypes=constructor.getParameterTypes();


  • 成员变量也是对象

    java.lang.reflect.Field

    Field类封装了关于成员变量的操作

    getFields()方法获取的是所有public的成员变量的信息

    getDeclaredFields获取的是该类自己声明的成员变量的信息


    得到成员变量的类型的类类型

    Class fieldType=field.getType();


首页上一页1234567下一页尾页

举报

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