java中的动态代理(一)

今天我们来学习java中的另一个重要的特性叫做动态代理。所谓动态代理是可以在java运行过程中动态的创建一个类去实现一个或多个接口,可以在不修改原有类代码的基础上动态的添加功能和方法。正是因为这个特性使动态代理被java的许多框架中被广泛的使用。

在介绍动态代理之前我需要先介绍一下什么是静态代理。在设计模式那一章我曾经介绍过一种设计模式叫做代理模式。在代理模式中有一个公共的接口,代理对象和实际的对象都需要去实现这个接口。在代理对象中有一个成员属性变量指向实际对象并在代理对象的构造函数中初始化,在实现公共接口的方法中它转发给了实际的对象并打印了一些调用信息。

public class StaticProxyTest {

    static interface BaseService {
        void say();
    }

    static class RealService implements BaseService {
        @Override
        public void say() {
            System.out.println("i am realService!");
        }
    }

    static class ProxySerice implements BaseService {

        private BaseService realService;

        public ProxySerice(BaseService baseService) {
            this.realService = baseService;
        }

        @Override
        public void say() {
            System.out.println("say before");
            realService.say();
            System.out.println("say after");

        }
    }

    public static void main(String[] args) {
        BaseService realService = new RealService();
        BaseService ProxySerice = new ProxySerice(realService);
        ProxySerice.say();

    }

}

上面的代码实现了在不改变原有service的基础上添加了打印日志的功能,为了实现这个功能我们创建了一个ProxyService对象,它的代码是在程序里固定的所以被称为静态代理。

由于静态代理需要为每一个类都创建一个代理对象,这个工作量太庞大了而且如果有新的切面需求也比较的不好扩展,所以在平时的开发中我们一般使用的是动态代理模式。

原文地址:https://www.cnblogs.com/suyang-java/p/10925273.html

时间: 2024-10-12 11:16:40

java中的动态代理(一)的相关文章

java中的动态代理机制

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.下面通过代码来学习java中的动态代理技术. 首先定义一个接口: package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public interface Perform { public void play(); } 实

使用Java中的动态代理实现数据库连接池

2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度.很多的连接池 都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前

十分钟理解Java中的动态代理

十分钟帮助大家理解Java中的动态代理,什么是动态代理?感兴趣的小伙伴们可以参考一下 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 一.概述1. 什么是代理我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家"委托"代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,"委托

java中的动态代理(二)

上一节我介绍了什么是静态代理.在静态代理中的代理对象是直接定义在代码中的,这样会导致代码不能复用并且工作量也会成倍的增加所以在日常的开发中我们更多使用的是动态代理模式.在动态代理中,代理类在是程序运行中动态生成的,在java中一般有两种方式来实现动态代理模式,它们分别是javaSDK动态代理和第三方类库cglib动态代理. 今天我介绍的是java SDK动态代理.首先我们先来看一下如何使用java SDK实现动态代理模式: public class JavaSDKProxyTest { stat

Java中的动态代理以及Proxy类的偷瞄

动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包下,主要涉及到两个类. (1)接口InvocationHandler:该接口中仅定义了一个方法. Object invoke(Object obj, Method method, Object[] args); 在实际使用时,第一个参数obj一般指代理类,method是被代理的方法,args为该方法

java中的动态代理

一.类中实现了接口,使用java.lang.reflect.Proxy类,创建一个代理工厂,可以动态代理类中方法. 说明:被代理的类需要有实现的接口. 例子: 1 实体类代码 实体类代码 public class UserDao implements IUserDao{ public UserDao() { // TODO Auto-generated constructor stub } public void saveUser() { System.out.println("保存用户成功,s

Java 代理模式(二) Java中的动态代理

动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Object invoke(Object proxy, Method method, Object[] args) 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组(无参时设置为null). 这个抽象方法在代理类中动态实现. 2

Java中的动态代理及反射机制

面向对象的基本原则封装.继承.多态,在java中多态机制,表现为变量多态,方法多态,这都是指的是因对象所属的类不同,而调用不同的类方法:对于对象的方法,还有函数重载,java中的函数的签名是由函数名+参数方法来定的,不能仅由返回值不同来定. 反射Reflect 运行时获取类的类型,域,方法等各种属性. Class是一个类,其实例对应其他不同分 (CalculatorImpl)Class.forName("CalculatorImpl").newInstance(); newInstan

java中的动态代理Proxy

动态代理是java语言的一个神奇的地方,不是很好理解,下面来看看关键的地方. InvocationHandler 是一个接口,官方文档解释说,每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类,由它决定处理. public interface InvocationHandler { public Object invoke(Object proxy, Method meth