美文网首页
Java代理

Java代理

作者: losspm | 来源:发表于2019-11-20 16:12 被阅读0次

前言

Java代理大致可以分为静态代理(static proxy),动态代理(dynamic proxy)。所谓代理,就是在原来对象的基础上代之行之。可以完全采用原对象的方法,又可以避免跟原对象产生必要的关联。我一般情况到只是认为,在原有对象上再隔离一层也许看起来有那么多余,但是对于单例模式的时候,并且需要构建相应的新对象时候,可以用上代理模式。比如房东 - 房产中介模式,之后看到更具体应用的介绍,在一般的项目中,所有的函数入口和出口增加日志记录,不可能去一条条的加入日志,因此需要引入代理模式

静态代理

假设有Permission相应接口

package proxyDemo;

public interface PermissionInterfaces {
    String getStatus();
    Boolean isGranted();
    void authorized();
}

有一个对象 permission giver

package proxyDemo;

public class PermissionProvider implements PermissionInterfaces {
    public String getStatus() {
        return 'NO_PERMISSION';
    }

    public Boolean isGranted() {
        return true;
    }

    public void authorized() { 

    }
}

其中,PermissionProvider有三个方法,分别为getStatus(); isGranted(); authorized()
此时,要用静态方法代理的话,即从PermissionProvider延伸出proxy类

package proxyDemo;

public class PermissionProviderProxy implements PermissionInterfaces {
    PermissionProvider permissionProvider;

    public PermissionProviderProxy (PermissionProvider permissionProvider) {
        this.permissionProvider = permissionProvider;
    }

    public String getStatus() {
        permissionProvider.getStatus();
    }
    public Boolean isGranted() {
        permissionProvider.isGranted();
    }
    public void authorized() {
        permissionProvider.authorized();
    }

}

在测试类中如下

package proxyDemo;

public class StaticProxyTest {
    public static void main(String[] args) {
        PermissionProvider permissionProvider = new PermissionProvider();

        PermissionInterfaces permissionProviderProxy = new PermissionProviderProxy(permissionProvider);

        permissionProviderProxy.getStatus();

    }
}

运行StaticProxyTest时候,会打印出Please tell me

静态代理目前存在的缺点就是,对于原本类,每一个方法都需要去实现,如果有1000个方法,则要在代理类手动去实现1000个方法,不具有很强的扩展性。静态代理偶尔写写demo以及小工具还行,遇到需要扩展的场景就有一定的局限性了

动态代理

为了避免每一次都去完全实现需要代理类的接口,此时我们需要利用到动态代理,主要涉及到的是JDK中的java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类,主要入口是proxy。

proxy

Proxy类中提供了一个静态方法,getProxyClass(ClassLoader, interfaces),只需要传入ClassLoader(类加载器)以及interfaces就可以返回一个原Class的一个代理对象。并且返回出来的对象能够构造相应的实体出来,用之前看过的资料一句话来说,就是以Class构造Class。
但是实际编程中,一般使用Proxy.newProxyInstance(),直接返回代理实例,具体实例待补充;

JDK动态代理缺点

JDK的动态代理是基于接口进行代理,但是如果要代理一个类就只有普通方法时候,没有定义的interface,那么JDK的代理就不能使用了,此时得需要cglib对动态代理进行补充

相关文章

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • Java 中的HTTP/Socks代理设置

    在内网环境,有些时候需要设置Java代理,常见的有HTTP(s)代理和Socks代理,如何设置代理,Java 可以...

  • 代理简记

    Java静态代理 委托类和代理类,实现共同接口 共同接口: 委托类: 代理类: 测试结果: Java动态代理 通过...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java | 什么是动态代理?

    最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

网友评论

      本文标题:Java代理

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