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

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

Cedar
难度入门
时长 1小时20分
  • class类的使用
    查看全部
    0 采集 收起 来源:Class类的使用

    2016-08-30

  • Eclipse小技巧:选中一段代码->右键Refactor->Move可以把这段重构成新的方法。
    查看全部
  • 继承补充 java中: 1-3类似 4父、子的构造方法确实不同,但子类构造方法会隐含调用父类构造方法的super(),因此会递归调用父类的构造方法。一般的方法当然是直接继承,当然重写过的就算了。 5并不需要“:父类的构造方法”,但子类的构造方法中会隐含调用父类构造方法的super();
    查看全部
  • 泛型补充 注意:泛型的限定作用只在编译阶段起作用,其目的只是为了防止程序员在写代码的时候放入了错误类型的元素,当编译完成后,程序执行时,泛型不再起任何限定作用,此时如果利用反射(详见下文的反射部分),动态创建class类的对象(等于List类),然后利用方法的反射操作来调用add,就可以加入任何类型的元素了,所以绕过了编译就绕过了泛型。
    查看全部
  • * 反射的作用在于可以在程序执行的时候动态加载一个类,不需要在编译的时候静态的先把类写好(用传统的new方法创建对象则要求这个类必须在编译之前就写好)。 对之前的写法进行改造: 1)定义一个统一接口 public abstract interface JK { …//方法 } 2)在需要的代码段中动态加载类: Class c3 = null; c3 = Class.forName(args[0]); // args[0]可通过命令行输入Foo //注意要try-catch(Exception e)哦,此处省略 3)用c3获取类的信息,如前文所述。 4)用c3创建JK对象 JK jk = (JK) c3.newInstance(); 此时就可以用“jk.方法(参数1, 参数2, …)”,或者用方法的反射操作(比如已经获取了Method m,就可以m.invoke(jk, 参数1, 参数2, …);,和“jk.方法(参数1, 参数2, …)”等效的)来实现jk的功能。 5)其他程序员在定义需要动态加载进来的类时,需要implements这个JK接口。
    查看全部
  • 反射2 - c1还有一些方法获取Foo类的信息(所以此时什么private都没用了): c1.getName(),获得类含包名的全名 c1.getSimpleName(), 获得类的名称 Method[] ms = c1.getMethods,获取类的全部方法(还有c1.getDeclearedMethods()是只获取类自己声明的方法(不含父类那继承下来的))(还支持只获取类中特定名字的方法,在其参数传入方法名和参数列表就可以,如Method m = c.getMethod(“print”,int.class,double.class)这样,注意要try-catch(防止万一这个方法不存在)),然后就可以遍历数组,用Class reType = ms[i].getReturnType; reType.getName(); 获得方法的返回值;用ms[i].getName()获得方法的名称;用Class[] paraType = ms[i].getParameterTypes(); paraType[j].getName(); (再遍历class数组)获得方法的入参类型。 Constructor[] cs = c1.getDeclearedConstructors();获取类的(自己声明的)构造方法。用法与上一段method类似。 Field[] fs = c.getFields();获取类的全部成员(属性)变量(还有c1.getDeclearedFields()是只获取类自己声明的成员(不含父类那继承下来的)),然后就可以遍历数组,用Class fType = fs[i].getType; fType.getName(); 获得成员的类型,用fs[i].getName()获取成员的名字。
    查看全部
  • 反射1 * 类其实也是对象,是Class类的对象,例如,创建一个类class Foo{},这个Foo类本身也是一个对象,是Class类的对象。 - 声明: Class c1 = Foo.class;(说明任何一个类都包含一个隐含的静态成员class) (类名 对象名(但也是类名)) 或不知道Foo类名但知道其对象名foo1时: Class c2 = foo1.getClass(); (类名 对象名(但也是类名)) 还可以 Class c3 = null; c3 = Class.forName(类的包含包名在内的全名); (这样,c1 == c2 == c3) 因此,foo1是Foo的对象,Foo是Class的对象。 同时,foo1是c1的对象,c1是Class的对象,因此,通过c1可直接创建Foo的对象: try{ Foo foo2 = (Foo)c1.newInstance(); //通过c1可创建Foo类的对象foo2, //前提是Foo类包含无参构造方法 foo2.方法; //实现foo2的功能(也可以通过方法的反射invoke操作,等效) } catch (InstantiationException e){ e.printStackTrace(); } catch (IllegalAccessException e){ e.printStackTrace(); }
    查看全部
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
    查看全部
  • 想要获得一个类的信息必须先得到这个类的类类型
    查看全部
  • simpleName 不包含包名的类的名称
    查看全部
  • 动态加载,在运行时加载,通过类类型创建对象,如何让多个类在一个方法内加载? 让多个类实现同一个接口,通过接口的类类型来实现多个类的功能。
    查看全部
  • 静态加载类必须全部存在否则 程序无法运行。
    查看全部
  • new 对象是静态加载类,在编译时就会加载所有你可能使用到的类。
    查看全部
  • package com.reflect; public class ClassDemo { public static void main(String[] args) { //User的实例对象 User user=new User(); //User这个类也是一个实例对象,Class类的实例对象 /* * 第一种表示方法 * 任何一个类都有一个隐含的静态成员变量class */ Class class1=User.class; /* * 第二种表示方法 * 已知该类的对象提供getClass()获得 */ Class class2=user.getClass(); /* * 第三种表示方法 * */ try { Class class3=Class.forName("com.reflect.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(class1==class2); System.out.println(class1.equals(class2)); //通过该类的类类型创建该类的实例对象 try { User user2=(User)class1.newInstance(); user2.print(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } class User{ public void print(){ System.out.println("User"); } }
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

  • 获取类类型的三种方法: Calss.forName object.getclass 获取类的方法:类类型.getName.getMethods 包含父类的 类类型.getDeclaredMethods 本类自定义的
    查看全部

举报

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

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