为何使用java反射机制

  • 反射机制如何使用
  • android实例

android中一些代码都使用了java的反射机制,那么为什么要去使用反射机制?

反射机制如何使用

反射一般使用的方式如下,对于类A来说,假设其类名为classNameStringA,则
A a = (A)Class.forName(“classNameStringA”).newInstance();
这和A a = new A(); 是一样的效果,那么为什么要这么麻烦?

android实例

下面是class PolicyManager中的部分代码,

    private static final String POLICY_IMPL_CLASS_NAME =
        "com.android.internal.policy.impl.Policy";

    private static final IPolicy sPolicy;

    static {
        // Pull in the actual implementation of the policy at run-time
        try {
            Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
            sPolicy = (IPolicy)policyClass.newInstance();
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(
                    POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);
        } catch (InstantiationException ex) {
            throw new RuntimeException(
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
        }
    }
  1. Class.forName(xxx.xx.xx)的作用是要求java虚拟机查找并加载指定的类,我们知道当加载类时,类的静态代码会被执行。从上面的代码我们能看到我们可以做更多的异常的处理,例如类无法被加载,无法被安装等(例如系统中该类本身不存在),给我们提供了更多的容错机制,但是仅仅这点优点肯定是不够的;
  2. IPolicy为一个接口,提供给用户去使用,对于类的实现,在上述代码中我们完全看不出来,只有一个类名, 这就是解耦!对于大型的软件,一个大公司的各个小组都有自己的分工,去实现不同的模块,那么各个小组之间如何协作就非常关键。例如A小组完成IPolicy接口的实现,而B小组需要使用A的实现,这时候就可以使用反射机制,B小组完全不用知道IPolicy是如何实现的,只需要知道实现后的类名即可,更甚,类名完全保存在一个xml或者属性中,由A小组去填充,这样B小组的代码看上去就和A毫无瓜葛;
  3. 在第一点中提到在加载类时,类的静态代码块会被执行,因此我们可以在静态代码块中去做一些全局的初始化的动作,例如驱动的加载、打开等,而不用去实例化类。

你可能感兴趣的:(为何使用java反射机制)