zoukankan      html  css  js  c++  java
  • 第53条:接口优先于反射机制

    核心反射机制java.lang.reflect提供了“通过程序来访问关于已装载的类的信息”的能力,给定一个Class实例,可以获得Constructor、Method、Field实例,这些对象提供“通过程序来访问类的成员名称、域类型、方法签名等信息”的能力。

    反射机制允许一个类使用另一个类,即使当前者被编译的时候后者还根本不存在,存在的代价:

    1.失去编译时类型检查的好处,包括异常检查。

    2.执行反射访问所需的代码很长。

    3.性能上的损失。

    反射功能只是在设计时被用到,通常,普通应用程序在运行时不应该以反射的方式访问对象。

    有些复杂的应用程序需要使用反射机制,包括类浏览器、对象检测器、代码分析工具、解释型的内嵌式系统。在RPC中使用反射机制也是合适的,这样就不再需要存根编译器。

    对于有些程序,必须用到在编译时无法获取的类,但是在编译时存在适当的接口或者超类,通过它们可以引用这个类,就可以以反射的方式创建实例,然后通过它们的接口或者超类,以正常的方式访问这些实例。

    创建Set<String>实例,吧命令行参数插入到集合中,然后打印该集合,其中第一个参数指定打印的结果,如果是HashSet以随机的方式打印出来,如果是TreeSet按照字母顺序打印出来的程序:

    public static void main(String[] args) {
            Class<?> c = null;
            try {
                c = Class.forName(args[0]);
            } catch(ClassNotFoundException e) {
                System.out.println("Class not found");
                System.exit(1);
            }
            Set<String> s = null;
            try {
                s = (Set<String>) c.newInstance();
            } catch(IllegalAccessException e) {
                System.out.println("Class not accessible");
                System.exit(1);
            } catch(InstantiationException e) {
                System.out.println("Class not instantiable");
                System.exit(1);
            }
            s.addAll(Arrays.asList(args).subList(1, args.length));
            System.out.println(s);
    }

    对于复杂的系统编程任务,反射是必要的,如果编写的程序必须与编译时未知的类一起工作,如果可能,就应该仅仅使用放射机制来实例化对象,而访问对象时则用编译时已知的某个接口或者超类。

  • 相关阅读:
    常用的SQL优化
    mysql索引详细介绍
    作业2
    作业1
    python学习笔记(11)文件操作
    python学习笔记(10)函数(二)
    python学习笔记(9)函数(一)
    C#的dictionary使用总结
    常用的类型转化
    我的动态库“情节”
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5780978.html
Copyright © 2011-2022 走看看