从JDK1.3开始,java中引入了动态代理机制,有关的接口和类是InvocationHandler和Proxy,都位于java.lang.reflect包下。
InvocationHandler接口只定义了一个抽象方法:
Object invoke(Object proxy, Method method, Object[] args)
Proxy类中主要的2个静态方法:
Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)
Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
getProxyClass返回一个动态创建的代理类(Class),newProxyInstance则返回改代理类的实例(Object)。
借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),我们就可以解决静态代理模式中代码膨胀的问题。
使用了动态代理后,“代理角色”将不用手动生成,而由JVM在运行时,通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。
下面是一个动物世界的动态代理 example:
动物接口, 有一个奔跑的抽象方法
/**
* Created by jiangzhq on 2015/6/30.
*/
public interface Animal {
void run();
}
动物接口的实现类——老虎
public class Tiger implements Animal {
public void run() {
System.out.println("森林之王——老虎在跑");
}
}
动物接口的实现类——狮子
public class Lion implements Animal{
public void run() {
System.out.println("草原之王——狮子在跑");
}
}
动态角色:动态生成代理类
public class DynamicProxy implements InvocationHandler {
// 被代理的目标对象
private Object target;
// 通过构造函数注入
DynamicProxy(Object obj) {
this.target = obj;
}
// 通过反射动态生成对象
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doBefore();
Object result = method.invoke(target, args);
doAfter();
return result;
}
public void doBefore(){
System.out.println("动态生成代理类之前");
}
public void doAfter(){
System.out.println("动态生成代理类之后");
}
// 工厂方法,获取代理类实例
static <T> T factory(Object obj)
{
Class cls = obj.getClass();
return (T)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(obj));
}
}
客气端测试类
public class DynamicProxyTest {
public static void main(String[] args) {
Animal tiger = new Tiger();
Animal tigerProxy = (Animal) DynamicProxy.factory(tiger);
tigerProxy.run();
Animal lion = new Lion();
Animal lionProxy = (Animal) DynamicProxy.factory(lion);
lionProxy.run();
}
}
动态代理更好地面向了抽象,减少了重复的code,有更好的可维护性,符合面向接口编程的原则。
缺点:JDK的动态代理只能代理接口,不能代理没有接口的类。
分享到:
相关推荐
`代理模式之动态代理.ppt`则可能是一个PPT文档,提供了代理模式的理论介绍和代码示例。 4. **学习与实践** 要深入理解动态代理,你需要动手编写代码,尝试创建自己的`InvocationHandler`并使用`Proxy`来生成代理...
在Java中,动态代理是代理模式的一种实现方式,它允许我们在运行时创建代理对象,这种方式比静态代理更加灵活。动态代理在JDK 1.3及以后的版本中得到了支持,主要涉及到三个核心类:`Proxy`、`InvocationHandler`和`...
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2
[浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。
代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...
装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...
在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...
在Java中,代理模式可以通过静态代理和动态代理来实现。静态代理是在编译时就确定了代理关系,需要为每个真实对象创建一个对应的代理类。而动态代理(如Java的`java.lang.reflect.Proxy`类和`InvocationHandler`接口...
代理模式的实现通常有两种方式:静态代理和动态代理。静态代理是在编译时就确定了代理关系,需要为每个原始对象创建一个对应的代理类。动态代理则是在运行时动态创建代理对象,这通常通过Java的反射API或C#的`System...
在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...
代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...
详细而又简单的讲述了java动态代理设计模式