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

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

难度入门
时长 1小时20分
学习人数
综合评分9.67
759人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.5 逻辑清晰
  • new是静态加载,在编译时刻就需要加载类
    查看全部
  • 类的实例对象的三种表示方式 Class cl = Foo.class; Class c2 = foo1.getClass(); Class c3 =Class.forName("...Foo");
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

  • 任何一个类都有一个隐含的静态成员变量class
    查看全部
    0 采集 收起 来源:Class类的使用

    2015-04-12

  • 类是对象,是java.lang.Class类的实例对象
    查看全部
    0 采集 收起 来源:Class类的使用

    2015-04-12

  • 集合泛型是为了防止在编译时出错,
    查看全部
  • 要想得到类的方法或其他信息,首先得到类的类类型
    查看全部
  • & 通过反射了解集合泛型的本质 /** *泛型只是为了在编译之前检验错误,编译之后不存在泛型了 *集合中装的对象一般都是一样的所以需要泛型限制 *绕过编译就绕过了泛型的检验 ,通过反射调用方法来绕过编译 */ public class ClassEnum { public static void main(String [] args) throws Exception{ ArrayList al1 =new ArrayList(); ArrayList<String> al2 = new ArrayList<String>(); //al2.add(10); //在这里加入10 是不行的,因为有泛型的限制 al2.add("hello"); //下面的输出结果是true,所以al1,al2的类类型是一样的 System.out.println(al1.getClass()==al2.getClass()); Class c =al1.getClass(); Method m = c.getMethod("add", Object.class); m.invoke(al2, 10); System.out.println(al2); //输出[hello, 10] 说明绕过了泛型的限制,泛型在编译后就不存在啦 } }
    查看全部
  • & 方法的反射的操作 如何获取某一个方法, 方法的操作method,invoke(对象,参数列表) 和对象名.方法操作方法不同的是:通过反射操作方法是绕过编译的 /** *通过反射操作方法。。。是绕过编译的 */ public class ClassDemo3 { public static void main(String [] args) throws Exception{ Class c = Class.forName("com.reflact.Demo"); Method m1 = c.getMethod("add", int.class ,int.class); m1.invoke(c.newInstance(), 10,20); System.out.println("================="); Method m2 =c.getMethod("changeString", String.class , String.class); m2.invoke(c.newInstance(), "hello","WORLD"); } } class Demo{ public void add(int i ,int j){ System.out.println("结果:"+(i+j)); } public void changeString(String str1 , String str2){ System.out.println(str1.toUpperCase()+str2.toLowerCase()); } }
    查看全部
  • & 获取成员变量及构造方法的信息 //构造方法被封装在Constructor类中 public static void getConstructor(Object obj) throws SecurityException, NoSuchMethodException{ Class c = obj.getClass(); //getConstructors() 得到所有public构造函数的信息 Constructor [] constructor= c.getConstructors(); for(Constructor cst : constructor){ System.out.print("构造方法名称是:"+cst.getName()+"("); for(Class para :cst.getParameterTypes()){ System.out.print(para.getName()+","); } System.out.println(")"); } } public static void getFiled(Object obj){ Class c = obj.getClass(); //getFields()是得到所有public的成员变量,一般不用这个方法 //.getDeclaredFields() 得到该类自己申明的成员变量的信息 private的变量也可以得到 //Field [] field = c.getFields(); Field [] field = c.getDeclaredFields(); for(Field f : field){ System.out.println("成员变量"+f.getType().getName()+" "+f.getName()); } }
    查看全部
  • & 获取类的信息 基本数据类型,void关键字都有类类型 成员变量也是对象是java.lang.reflact.field 获得方法信息 public class MethodInfo { public static void getInfo(Object obj){ //得到类的类类型 Class c = obj.getClass(); //通过该类的类类型得到类的名字 System.out.println("类名是:"+c.getName()); //getMethods()是获得所有public方法,包括从父类继承过来的 //getDeclaredMethods() 是获得自己定义的方法 Method [] m = c.getMethods(); for(Method m1 : m){ //获得方法的返回值类型 (得到的是返回值类型的类类型) Class paraReturnType = m1.getReturnType(); System.out.print(paraReturnType.getName()+" "); //获得方法的名称 System.out.print(m1.getName()+"("); //获得方法的参数列表的类的类类型 for(Class para : m1.getParameterTypes()){ System.out.print(para.getName()+","); } System.out.println(")"); } } }
    查看全部
  • & class 动态加载类的方法 编译时加载的类是静态加载,运行时是动态加载 import java.lang.reflect.*; public class Office{ public static void main(String [] args) throws Exception{ //new 的方式来实例化,是在编译时就加载是静态加载 //只定义了类Excel ,想让程序能运行,就要用到动态加载了 if("Excel".equals(args[0])){ /*Excel e = new Excel(); e.start();*/ //类的动态加载 Class c = Class.forName(args[0]); //方法1 Object obj = c.newInstance(); for(Method m: c.getMethods() ){ if(m.getName().equals("start")){ m.invoke(obj); } } //方法2 /*可通过给Excel world 类定义一个接口 InterfaceTest, 让 他们都实现这个接口,实现这个规范 就可以 InterfaceTest ic = (InterfaceTest)c.newInstance(); ic.start(); 即可 利用多态实现 */ } } } class Excel{ public void start(){ System.out.println("excel"); } } /*class World{ public void start(){ System.out.println("world"); } } */ 小结: 动态加载类的好处: 增加程序的灵活性,避免因为一个类没有而使其他的都编译不过,我们可以在程序中判断该类是否存在,且使用动态加载避免编译不过的问题。。而且,我们这里如果新增加一个world类,我们只需编译world类,主功能类不需改变。。(一些程序的更新就是这样做的)
    查看全部
  • class类: 类也是对象,类是java.lang.Class类的实例对象 there is a class named Class 任何一个类都是Class的实例对象,这个实例对象有三种表现方式 & 案例(得到class type 的三种方法 ) public class ClassDemo1 { public static void main(String [] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //Foo这个类的实例对象如何表示 Foo foo1 =new Foo(); //foo1就是Foo的实例 //Foo是Class的实例,class类的实例对象如何表示 //任何一个类的实例对象都有三种表示方式 Class c1 = foo1.getClass(); // 1.已知该类的一个实例对象 Class c2 = Foo.class; //2.已知类名,调用静态成员 System.out.println(c1==c2);//true,一个类只有一个class Type(类的类类型) Class c3 = Class.forName("com.reflact.Foo"); //3.已知类名,调用Class中的forName方法 System.out.println(c3==c2); //true //通过类的class Type 得到该类的实例对象 Foo foo2 = (Foo)c1.newInstance(); //就可以通过该实例调用该类中方的方法了 foo2.info(); } } class Foo{ public void info(){ System.out.println("info function........"); } }
    查看全部
  • 类是对象,类是java.lang.Class类的实例对象 Class c1 = Foo.class; 任何一个类都有一个隐含的静态成员 Class c2 = foo1.getClass(); 类也是对象,是Class类的实例对象。 Class c3 = null; c3 = Class.forName("com.imooc.reflect.Foo")
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

  • java 语言中,万事万物皆对象 只有基本数据类型和静态的不是对象 类是对象,类是java.lang.Class类的实例
    查看全部
    0 采集 收起 来源:Class类的使用

    2015-04-10

  • 类是对象,类是java.lang.Class类的实例对象 Class c1 = Foo.class; 任何一个类都有一个隐含的静态成员 Class c2 = foo1.getClass(); 类也是对象,是Class类的实例对象。 Class c3 = null; c3 = Class.forName("com.imooc.reflect.Foo")
    查看全部
    0 采集 收起 来源:Class类的使用

    2018-03-22

举报

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

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

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