`
dzq2008
  • 浏览: 92063 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

Java中实现动态代理

阅读更多

 

代理模式是Java 设计模式中很常用的一种设计模式,它的特点是代理类和被代理类具有相同的接口,这样代理类才能代理被代理类。当我们执行被代理类的某些方法的时候,委托给代理类,代理类可以在被代理类方法的执行前后多做一些事情。类似于Spring中的AOP
代理类可分为两种形似。一种为静态代理类,由程序开发人员自己编写代理类;另外一种为动态代理类,在程序运行时,运用反射机制动态生成。动态代理类不需要程序开发人员编写源代码。运用Java的反射机制生成,扩展容易。

java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的功能。

Proxy类通过静态方法创建代理类和代理类的实例

下面通过一个简单的实例讲解如何使用动态代理

首先创建一个简单的接口IHello,其中只有一个方法sayHello,无论是常规类,还是代理类都需要实现此接口。

 

package dynamicpro;

public interface IHello {
    public void sayHello();
}

创建实现此接口的类HelloImpl,此类为日后的被代理类

 

package dynamicpro;

public class HelloImpl implements IHello {
    public HelloImpl() {
    }

    public void sayHello() {
        System.out.println("Hello World");
    }

}
 

下面通过工厂方法创建动态代理类及其实例

package dynamicpro;
import java.lang.reflect.*;
public class HelloFactory {
    public HelloFactory() {
    }
    public static IHello getHelloProxy(final IHello hello){
        InvocationHandler handler=new InvocationHandler(){
            public Object invoke(Object proxy, Method method, Object[] args) throws
                    Throwable {
                System.out.println("before calling "+method);
                Object result=method.invoke(hello,args);
                System.out.println("after calling "+method);
                return result;
            }
        };
        Class classType=IHello.class;
        return (IHello)Proxy.newProxyInstance(classType.getClassLoader(),new Class[]{classType},handler);
    }
}
 

创建动态代理类时,使用 Proxy.newProxyInstance方法。此方法需要InvocationHandler接口类型的参数。所以创建 InvocationHandler对象,并实现invoke方法。当动态代理类代理其他的类的时候,调用此方法。invoke方法的三个参数分别为:代 理类对象,调用的被代理类的方法,方法的参数。我们可以在invoke方法中编写适当的代码,当执行被代理类的方法的时候多做置前和置后的一些处理。比如 这里只是在方法的执行前后输出一些内容。

Proxy.newProxyInstance方法返回动态 代理类的实例,第一个参数指名被代理类的类型,显然是IHello接口类型,第二个参数是被代理类所实现的所有的接口类型。显然也是 IHello.class。第三个参数即为刚才创建的InvocationHandler对象,当执行被代理类的方法时候,调用其中的invoke方法。

编写测试类进行测试:

 

package dynamicpro;

public class HelloTest {
    public HelloTest() {
    }

    public static void main(String[] args) {
        IHello hello=new HelloImpl();
        IHello helloProxy=HelloFactory.getHelloProxy(hello);
        helloProxy.sayHello();
    }
}
 

运行结果如下:

 

before calling public abstract void dynamicpro.IHello.sayHello()
Hello World
after calling public abstract void dynamicpro.IHello.sayHello()
 
分享到:
评论

相关推荐

    Java实现动态代理

    Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...

    Java动态代理两种实现方式

    而Cglib则不需要目标对象实现接口,通过继承目标类实现代理,因此适用于没有接口或不希望修改原有代码的情况。不过,Cglib生成代理类的速度比JDK慢,且内存占用稍高。 总结来说,Java动态代理为开发者提供了灵活的...

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

    在Java编程中,动态代理是一种强大的工具,它可以让我们在运行时创建一个实现了特定接口的新类。在本文中,我们将探讨如何使用Java的动态代理来实现数据库连接池,从而解决传统连接池设计中的耦合度问题和资源管理...

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    java-jdk动态代理的实现demo

    在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...

    jdk与cglib动态代理与底层实现

    JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...

    Java中的动态代理

    ### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...

    java反射与动态代理笔记

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...

    用Java动态代理实现AOP

    在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想是将日志记录、性能统计、安全控制、事务处理等方面的代码从商业逻辑代码中分离出来,以提高...

    Struts2 拦截器 和 Java 中的动态代理

    Java中的动态代理(Dynamic Proxy)是实现拦截器机制的基础。动态代理允许我们在运行时创建一个实现了指定接口的新类。这个新类可以在方法调用前后插入自定义的行为,类似于拦截器的功能。Java的`java.lang.reflect....

    java(cglib)动态代理样例

    CGlib(Code Generation Library)是Java中实现动态代理的一种常见方式,特别是在Java代理接口不适用或者目标类没有实现任何接口的情况下。 动态代理的主要应用场景包括日志记录、性能监控、事务管理、权限控制等。...

    java动态代理

    3. **设置回调函数**:使用`setCallback`或`setCallbacks`方法设置回调函数,这类似于Java动态代理中的`InvocationHandler`。 4. **指定目标类**:通过`setSuperclass`方法指定要代理的类。 5. **创建代理对象**:...

    关于Java的动态代理机制.rar

    首先,我们要了解Java中实现动态代理的两种方式:一是使用Java的标准库`java.lang.reflect.Proxy`类,二是自定义实现`java.lang.reflect.InvocationHandler`接口。`Proxy`类是Java提供的一种标准的动态代理实现,而`...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    Java实现简单动态代理连接池

    Java实现简单动态代理连接池

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    Java中动态代理的介绍及实例

    ### Java中动态代理的核心知识点详解 #### 一、动态代理概览 动态代理是Java反射机制的一个重要应用,主要用于在不修改目标对象源代码的情况下,为一个对象提供一个代理对象,这个代理对象能够控制对目标对象的...

Global site tag (gtag.js) - Google Analytics