美文网首页
泛型与反射

泛型与反射

作者: 小编 | 来源:发表于2017-10-12 16:26 被阅读34次

    引入泛型的目的

    通过泛型使得在编译阶段完成一些类型转换的工作,避免在运行时强制类型转换而出现ClassCastException,即类型转换异常。

    优点

    在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

    1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

    2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

    3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

    Java反射机制定义

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    1.通过完整包名和类名获取类的Class对象clazz;
    2.通过Class对象clazz获取它的构造函数,属性和方法所对应的Constructor对象,Filed对象和Method对象。【getConstructors()、getMethods()、getFields()】
    3.通过Class对象clazz生成类的实例对象obj。【newInstance()】
    4.反射调用方法。【Method.invoke(Object obj, Object... args)】

    Class clazz = Class.forName("com.yolo.Person");
    Constructor constructor = clazz.getConstructor(null);
    
    // 获得与该方法对应的Method对象
    Method methodSetName = clazz.getDeclaredMethod("setName", String.class);
    Method methodGetName = clazz.getDeclaredMethod("getName");
    // 获得与该属性对应的Filed对象
    Field field = clazz.getDeclaredField("name");
    Field fieldAge = clazz.getDeclaredField("age");
    
    // 实例化Person对象
    Person p = (Person) clazz.newInstance();
    Person p1 = (Person) constructor.newInstance();
    
    // 调用指定的函数并传递参数
    methodSetName.invoke(p, "tracelss");
    methodGetName.invoke(p);
    
    // 访问成员变量,如果是基础数据类型,则使用setXXX/getXXX形式的方法,否则直接使用set/get
    field.set(p, "xin");
    fieldAge.setInt(p, 18);
    

    相关文章

      网友评论

          本文标题:泛型与反射

          本文链接:https://www.haomeiwen.com/subject/kbfoyxtx.html