代理模式是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中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...
而Cglib则不需要目标对象实现接口,通过继承目标类实现代理,因此适用于没有接口或不希望修改原有代码的情况。不过,Cglib生成代理类的速度比JDK慢,且内存占用稍高。 总结来说,Java动态代理为开发者提供了灵活的...
在Java编程中,动态代理是一种强大的工具,它可以让我们在运行时创建一个实现了特定接口的新类。在本文中,我们将探讨如何使用Java的动态代理来实现数据库连接池,从而解决传统连接池设计中的耦合度问题和资源管理...
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...
在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想是将日志记录、性能统计、安全控制、事务处理等方面的代码从商业逻辑代码中分离出来,以提高...
Java中的动态代理(Dynamic Proxy)是实现拦截器机制的基础。动态代理允许我们在运行时创建一个实现了指定接口的新类。这个新类可以在方法调用前后插入自定义的行为,类似于拦截器的功能。Java的`java.lang.reflect....
CGlib(Code Generation Library)是Java中实现动态代理的一种常见方式,特别是在Java代理接口不适用或者目标类没有实现任何接口的情况下。 动态代理的主要应用场景包括日志记录、性能监控、事务管理、权限控制等。...
3. **设置回调函数**:使用`setCallback`或`setCallbacks`方法设置回调函数,这类似于Java动态代理中的`InvocationHandler`。 4. **指定目标类**:通过`setSuperclass`方法指定要代理的类。 5. **创建代理对象**:...
首先,我们要了解Java中实现动态代理的两种方式:一是使用Java的标准库`java.lang.reflect.Proxy`类,二是自定义实现`java.lang.reflect.InvocationHandler`接口。`Proxy`类是Java提供的一种标准的动态代理实现,而`...
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
Java实现简单动态代理连接池
本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...
### Java中动态代理的核心知识点详解 #### 一、动态代理概览 动态代理是Java反射机制的一个重要应用,主要用于在不修改目标对象源代码的情况下,为一个对象提供一个代理对象,这个代理对象能够控制对目标对象的...