为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
反射——Java高级开发必须懂的_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

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

Cedar
难度入门
时长 1小时20分
  • Class类的实例对象的三种表示方式(1)
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-12-09

  • 用接口,调用类,实现动态加载
    查看全部
  • method.invoke(对象,参数列表)
    查看全部
  • class类的基本API操作
    查看全部
  • 任何一个类都是Class的实例对象
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-12-05

  • 动态加载 1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载 2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。 3、通过Class.forName()方法【动态加载类】,可以用到一个类时,才进行加载。 【功能性的类尽量使用动态加载,并对新添的类实现功能性接口(标准),这样就不用重新编译】
    查看全部
  • 加载类,区分编译和运行
    查看全部
  • Class类 1.【静态的成员,普通数据类型不是对象】 2.【类是java.lang.Class类的实例对象,这个对象表示这个类的类类型(class type) Class类的构造器是private的,所以我们不能创建Class的对象,只能由JVM来创建Class的对象。】 (1)Class c1 = 类名.class;(说明每个类(对象)都有一个隐含的静态成员变量class) (2)Class c2 = 类的实例对象.getClass(); (3)Class c3 = Class.forName(类名); 一个类只有一个类类型(class type) 4.可以通过类类型来获取一个类的实例对象: c1.newInstance() c1是A类的类类型,创建出A类的对象(此处c1为Foo的类类型,创建出Foo类的一个实例对象),因此根据得出的结果需要做强制类型转换(不加那个 Foo 类型是可以的  但是编译器会报警告  提示这里 等号两边的 类型不一样) 类名 类的实例对象名称 = (类名)c1.newInstance();前提是该类有无参构造方法。
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-12-05

  • 1.我们写的类是class类的对象 2.实例对象的三种表达方式 1)Class cl =Foo.class; 2)Class c2 =foo1.getClass(); 3)Class.forName(""); 3.类类型创建类的实例 Foo foo = (Foo)c1.newInstance(); 需要有无参构造方法
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

  • 泛型的本质: 泛型只在编译阶段有效,绕过编译就无效了! ----------------------------------------------------- ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<String>(); list1.add("hello"); /* list1.add(20); 报错,因为这是String类型的泛型,只能传入String类型的参数*/ Class c1 = list.getClass(); Class c2 = list1.getClass(); System.out.print(c1 == c2);//输出true 【说明】 反射的操作都是编译之后的操作 c1 == c2 结果返回true说明编译之后集合的泛型是去泛型化的 Java中集合的泛型,是防止错误输入的只在编译阶段有效,绕过编译就无效了 【验证:我们可以通过方法的反射来操作,绕过编译】 Method m = c2.getMethod("add",Object.class); m.invoke(list1,20);//绕过编译操作就绕过了泛型 System.out.print(list1.size());//输出2[之前添加了hello,现在添加了20,所以长度为2] 【注:这里只能用下面这种方式输出】 System.out.print(list1);//输出(hello,20) 如果采用for(String string :list1){ System.out.println(String); }这种方式就会报错!!因为默认以为输出的应该全部是字符串~
    查看全部
  • 方法的反射操作能帮我们做什么: 1)如何获取【某个】方法: 方法名称+方法参数列表才能唯一决定某个方法 ------------------------------------------------------- 1.获取一个方法就是获取类的信息,获取类的信息首先要获得类类型 A a1 = new A(); Class c = a1.getClass(); 2.获取方法 (必须要名称和参数列表来决定) /* c.getMethod(name,parameterType);//获取public的方法 c.getDeclaredMethod(name,parameterType);//获取自己声明的方法 */ Method m = c.getMethod("print",new Class[]{int.class,int.class}); 或 Method m = c.getMethod("print",int.class,int.class); //该方法会抛异常,因为有可能该方法不存在 ------------------------------------------------------- 3)方法反射操作 method.invoke(对象,参数列 表); 【方法的反射操作是用m对象来进行方法调用,而不是用A类的a1实例对象来调用,但和a1.print()调用的效果完全相同】 //这里的Object o的值是:方法如果没有返回值则为null,如果方法有返回值则为具体的返回值 Object o = m.invoke(a1,new Object[]{10,20}); 或 Object o = m.invoke(a1,new 10,20); //解释: 原本是a1操作print,a1.print(10,10); 而现在print作为【方法对象】赋值给了m 【反射就是进行反操作】 所以这时候就由print方法对象来操作a1 而这里的print方法对象就是m, 因此,m.invoke(a1,Object[]{10,10})的含义就是m.invoke(操作对象,参数); 调无参方法的例子:Method m = c.getMethod(); m.invoke(a1);或 m.invoke(a1,new class[]{});
    查看全部
  • 构造函数也是对象,java.lang.Constructor中封装了构造函数的信息。 Constructor[] cs = c.getConstructors();//获取所有的public构造函数方法 Constructor[] cs = c.getDecleardConstructors();//获取所有的构造函数 for(Constructor constructor :cs){ System.out.print(constructor.getName()+"(");//但其实构造函数无返回值 //获取构造函数的参数列表------->得到的是参数列表的类类型 Class[] paramTypes = constructor.getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class.getName()+","); } System.out.println(+")"); } ---总之:----------------------------------------- 想要得到类的信息,就先要得到类的类类型,之后就可以获得相关的信息了。
    查看全部
  • 成员变量也是对象,这些成员变量是由java.lang.reflect.field下面的Field类封装了成员变量的操作。 Filed[] fs = c.getFileds();//获取所有public的成员变量的信息 Filed[] fs = c.getDeclaredFields();//获取该类自己声明的成员变量信息 for(Field field :fs){ Class FieldType = field.getType();//获取成员变量的类型的类类型 String typeName = filedType.getName();//获取成员变量类型的名称 String fieldName = field.getName();//得到成员变量的名称 System.out.println(typeName+""+fieldName); }
    查看全部
  • 想要获得类的一些信息可以采用如下方法: 【想要获取类的信息,首先要获取类的类类型】 1.获取类的名称 Class c = obj.getClass(); c.getName();//这里的c是由obj的类型决定,如果obj是Foo类型则c为Foo的类类型 2.获取所有方法 【利用Method类(即方法对象)】 一个成员方法就是一个Method对象 Method[] ms = c.getMethods(); //getMethods()方法获取的是所有public的函数,包括父类继承而来的 Method[] ms = c.getDeclaredMethods(); //getDeclaredMethods()获取的是所有自己声明的方法,不问访问权限 3.获取方法名 Class returnType = ms[i].getReturnType();//得到方法的返回值类型的类类型 ms[i].getName();//获取方法名 4.获取参数类型【得到的是参数列表的类型的类类型】 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class.getName()+","); }
    查看全部
  • 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。 new对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类。 通过动态加载类可以解决该问题 Class c = Class.forName(); //通过类类型创建该对象 OfficeAble a = (OfficeAble)c.newInstance(); 此处的OfficeAble为接口[标准],以后需要用的类只要实现该接口即可。 -------------------------------------------------------------- 一般来说,功能性的类使用动态加载而不是静态加载
    查看全部

举报

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

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!