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

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

Cedar
难度入门
时长 1小时20分
  • 六、通过反射了解集合泛型的本质

    1、通过Class和Method了解泛型的本质

    2、Java集合中的泛型,是防止错误输入的,只在编译阶段有效,绕过编译机无效了

    ArrayList list1 = new ArrayList();

    ArrayList<String> list2 = new ArrayList<String>();

    Class c1 = list1.getClass();

    Class c2 = list2.getClass();

    System.out.Println(c1 == c2);

    打印出true,说明编译后集合的泛型是去泛型化的

    3、验证

    我们可以通过方法的反射来操作,绕过编译

    Method m = c1.getMethod("add",Object.class);

    m.invoke(list2,100);//绕过编译操作就绕过了泛型

    System.out.println(list2.size());

    打印出1,说明加进去了

    此时就不能用foreach来遍历了,否则会报类型转换异常

    查看全部
  • 五、Java 方法反射的操作

    1、如何获取某个方法

    方法名称和方法参数列表才能唯一决定某个方法

    先获取该类的类类型

    A a1 = new  A();

    Class c = a1.getClass();

    再通过类类型获取具体的方法

    c.getMethod("print",int.class,int.class);

    c.getMethod("print",new Object[]{int.class,int.class});

    2、方法反射的操作

    Object obj = method.invoke(对象,参数列表);

    Object obj = m.invoke(a1,10,20);

    Object obj = m.invoke(a1,new Object[]{10,20});

    如果该方法没有返回值,则返回null,如果有返回值则返回具体的值

    查看全部
  • 四、Java获取成员变量构造函数的信息

    1、成员变量也是对象

    是java.lang.reflect.Field的对象

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

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

    getDeclaredField()方法获取的是所有自己声明的成员变量

    field.getType()得到成员变量的类型的类类型

    field.getName()得到成员变量的名称

    2、构造函数也是对象

    是java.lang.reflect.Constructor的对象

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

    getDeclaredConstructors()获取所有的构造函数,构造方法必须是自己声明的

    constructor.getParameterTypes()得到构造函数的参数列表(参数列表的类类型)

    当一个类中没有定义构造函数时,系统会给该类中加一个默认的空参数的构造函数,方便该类初始化。只是该空构造函数是隐藏不见的。当在该类中自定义了构造函数,默认构造函数就没有了。

    构造函数不能继承,因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。

    查看全部
  • 三、Java获取方法信息

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

    2、Class类的基本API操作

    打印类的所有方法

    查看全部
  • 二、Java动态加载

    1、Class.forName("类的全称");

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

    请区分编译、运行

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

    2、静态加载

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

    查看全部
  • 可以写一个接口,接口里面写动态加载类的方法。以后要用到的每一个类都可以直接调用接口。
    查看全部
    1. Class类的使用

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

      Class c1 = Foo.Class();

      或者

      Class c2 = foo1.getClass();

      或者

      Class c3 = null;

      try{

      c3 = Class.ForName("com.namespace.classname");

      }catch(ClassNotFoundException e){

      }

            classname c = (classname)c1.newInstance();

    查看全部
    0 采集 收起 来源:Class类的使用

    2018-11-19

  • //反射中获取类名称方式两种

    a.getName();//获取全称(带报名,关键字除外)

    a.getSimpleName(); //不带包名的类名称

    //获取类型的方法

    a.getMethods();    //获取类型所有public的函数,包括父类继承的函数

    a.getDeclaredMethods()   //获取类自己声明的方法,不包括父类的

    a.getMethod("test");   //获取类中指定的方法名称


    查看全部
  • New是静态加载类,在编译时刻就要加载所有可能用到的类
    查看全部
  • 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
    查看全部
  • Java中集合的泛型,是防止输入错误的,只在编译阶段有效,编译之后就无效了!

    查看全部
  • 1、成员变量也是对象,是在java.lang.reflect.Field类,封装了关于成员变量的操作

    Field[] fs = c.getFields();//获取的是public的成员变量信息
    Field[] fs = c.getDeclaredFields();//获取的是该类自己声明的成员变量的信息

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

    Constructor[] cs = c.getConstructors//获取所有的public的构造函数
    Constructor[] cs = c.gerDeclaredConstructors()//得到所有的构造函数

    注:

     c.getInterfaces()//得到接口
     c.getModifiers()//得到访问权限
     c.getPackage()//得到包名
     c.getResource()//得到返回值
     c.getSuperclass()//得到父类

    想要的到类的信息,就必须先得到类的类类型

    Class c = Object.getClass();


    查看全部
  • 方法也是对象,方法是Method[]的对象

    Method[] ms = c.getMethods();//or c.getDeclaredMethods()

    Method类,方法对象

    一个成员就是一个Method对象

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

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

    for(int i = 0;i<ms.length;i++){
      //得到方法的返回值类型的类类型
      Class returnType = ms[i].getReturnType();
      System.out.print(returnType.getName()+" ");
      //得到方法的名称
      System.out.print(ms[i].getName()+"(");
      //获取参数类型-->得到的是参数类表的类型的类类型
      Class[] paramType = ms[i].getParameterTypes();
      for(Class c1:paramType){
        System.out.print(c1.getName()+",");
      }
      System.out.print(")");
    }


    查看全部
  • 1、什么是动态加载?什么是静态加载?

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

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

    通过动态加载类可以解决上述问题

    动态加载类:

    Class c = Class.forName(args[0]);
    功能接口 name = (功能接口 )c.newInstanc();
    name.方法();


    查看全部
  • Class.forName("类全称")实现运行时的动态加载类

    查看全部

举报

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

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