zoukankan      html  css  js  c++  java
  • java中为什么要使用代理

    引入代理:

    我们为什么要引入java的代理,除了当前类能够提供的功能外,我们还需要补充一些其他功能。

    最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。

    可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?

    在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小。

    如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。

    (转:https://www.cnblogs.com/silverLee/archive/2010/02/05/1664577.html)

    用简单的代码来解释代理的原理:

    被代理类:

    代理类:

    测试:

     注:代理一定要实现被代理类中的方法,于是我们经常会看见把代理和被代理中的方法抽象为一个借口,增加了一个约束。

    java中是如何实现代理的:

    这里就介绍管理基于接口的java代理 ,主要是用到了一个类和一个接口:

    一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的

    每一个动态代理类都必须实现InvocationHandler这个接口,这个接口中也只有唯一的一个具体实现方法invoke(),这个方法,当我们通过proxy类生成一个动态代理对象的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用

    invoke方法:

    Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    三个参数的具体意思:
    proxy:生成的代理类对象
    method:被代理类的某个具体方法
    arg0:实现方法的具体参数

    接口大概介绍完了,下面来介绍如何生成具体的代理类对象;
    Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

    三个参数的具体意义:

    loader:类加载器,一般使用被代理类的类加载器,当然使用接口的类加载器也是可以的
    InvocationHandler:表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了

    h:就是我们上面所说的InvocationHandler接口具体实现对象.

    介绍完这两个重要类和接口就可以实现java的基于接口的代理了




  • 相关阅读:
    wcf常用的概念
    WebApi初探之路由配置
    NuGet Package Manager 实用命令
    WebApi初探之基本操作(CRUD)
    Excel操作类
    在Runbook中添加Checkpoint-workflow
    总结PowerShell的常用命令
    alt text 与 tooltip区别
    IFrame 获取内容
    WP8.1 实现Continuation程序(打开文件,保存文件等)
  • 原文地址:https://www.cnblogs.com/zhongyimeng/p/9802590.html
Copyright © 2011-2022 走看看