资讯专栏INFORMATION COLUMN

JAVA动态代理

entner / 2495人阅读

摘要:代理的分类代理分为静态和动态代理。动态代理代理类在运行时产生,运用的反射机制动态创建而成。动态代理动态代理又可以分为库提供的和库提供,这里我们主要讲讲提供的动态代理。被代理对象实现的接口。,用于分派执行代理方法。

代理的分类

代理分为静态和动态代理。
静态代理:硬编码实现的代理类,在程序被编译成.class文件时代理类就已经存在。
动态代理:代理类在运行时产生,运用jdk的反射机制动态创建而成。

静态代理

静态代理可以通过组合的方式来实现,下面看具体的demo实现:

public class ProxyTest {

    @Test
    public void proxyMethodTest() {
       
        StaticProxy staticProxy = new StaticProxy(new ClientObject());
        System.out.println(staticProxy.get());
    }
}

interface ClientObjectInterface {
    public String get ();
}

class ClientObject implements ClientObjectInterface {
    public String get () {
        return "hi";
    }
}

class StaticProxy implements ClientObjectInterface {
    ClientObject clientObject;

    public StaticProxy(ClientObject clientObject) {
        this.clientObject = clientObject;
    }

    public String get() {
        return "proxy " + clientObject.get();
    }
}

运行结果:
proxy hi

当我们在使用的过程中发现ClientObject这个类随着业务需求的变化已经变得不够用了,这是我们该怎么办?保持着对修改关闭,扩展开放的原则,我们可以通过上面那种静态代理的方式来实现业务需求的变化,当然下面还有一种比较灵活的动态代理的方式来处理上面这种case。

动态代理

动态代理又可以分为jdk库提供的和cglib库提供,这里我们主要讲讲jdk提供的动态代理。jdk代理对象是通过java.lang.reflect.Proxy#newProxyInstance来进行创建的。

public static Object newProxyInstance(ClassLoader loader,
                                          Class[] interfaces,
                                          InvocationHandler h)

loader:被代理对象的classloader。
interfaces:被代理对象实现的接口。
h:invocation handler,用于分派执行代理方法。

下面看下具体的代理实现demo:

public class ProxyTest {

    @Test
    public void proxyMethodTest() {
        ClientObject clientObject = new ClientObject();
        ClientObjectInterface object = (ClientObjectInterface) Proxy.newProxyInstance(
            clientObject.getClass().getClassLoader(), clientObject.getClass().getInterfaces(),
            new ObjectProxy());
        System.out.println(object.get());
    }

}

interface ClientObjectInterface {
    public String get ();
}

class ClientObject implements ClientObjectInterface {
    public String get () {
        return "hi";
    }
}


class ObjectProxy implements InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("methodName: " + method.getName());
        return "no hi";
    }
}

运行结果:
methodName: get
no hi

当然可以在代理对象里面做很多事情,本demo只是简单的替换了被代理对象的函数体。

使用场景

代理的使用场景主要集中在,某一业务需要委托代理类集中处理某一业务然后再执行具体的实现类的业务逻辑。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66113.html

相关文章

  • java动态代理及RPC框架介绍

    摘要:这种语法,在中被称为动态代理。在动态代理机制中,这个角色只能是接口。动态代理就是实现的技术之一。 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理...

    2shou 评论0 收藏0
  • Java三种代理模式:静态代理动态代理和cglib代理

    摘要:动态代理又被称为代理或接口代理。静态代理在编译时产生字节码文件,可以直接使用,效率高。代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但会继承目标对象,需要重写方法,所以目标对象不能为类。 一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功...

    Kaede 评论0 收藏0
  • Java动态代理深度解析

    摘要:动态代理深度解析引言说起动态代理,很多人可能都没有直接去使用过。因为的动态代理只能代理接口,而不能代理原始的类。接下来是真正压轴的环节,实现自己的动态代理类。 Java动态代理深度解析 引言 说起动态代理,很多人可能都没有直接去使用过。但是只要用过Spring,那动态代理就是一个是个绕不过的坎,因为Spring的核心特性之一AOP就是基于动态代理来实现的,那么什么情况下需要用到动态代理...

    whinc 评论0 收藏0
  • Java代理设计模式(Proxy)的四种具体实现:静态代理动态代理

    摘要:除了和外,我们还有最后一招我直接把一个代理类的源代码用字符串拼出来,然后基于这个字符串调用的编译期,动态的创建一个新的文件,然后动态编译这个文件,这样也能得到一个新的代理类。 面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问茴香豆的茴字有哪几种写法? showImg(https://segmentfault.com/...

    gclove 评论0 收藏0
  • 你真的完全了解Java动态代理吗?看这篇就够了

    摘要:动态地代理,可以猜测一下它的含义,在运行时动态地对某些东西代理,代理它做了其他事情。所以动态代理的内容重点就是这个。所以下一篇我们来细致了解下的到底是怎么使用动态代理的。 之前讲了《零基础带你看Spring源码——IOC控制反转》,本来打算下一篇讲讲Srping的AOP的,但是其中会涉及到Java的动态代理,所以先单独一篇来了解下Java的动态代理到底是什么,Java是怎么实现它的。 ...

    haitiancoder 评论0 收藏0
  • Java中的动态代理

    摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...

    CastlePeaK 评论0 收藏0

发表评论

0条评论

entner

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<