应用场景:不改变被代理对象的代码,新建动态代理类,并在代理类中增加相应的处理代码。
在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理设计模式: InvocationHandler
//doBefore(): 在代理调用被代理方法前执行
//doAfter(): 在代理类调用被代理方法后执行
public class Dyn {
/** 获取代理对象 */
public static IHelloWorld getHelloWoldProxy() {
IHelloWorld hello = new HelloWorld();
InvocationHandler handler = new DynHandler(hello);
ClassLoader cl = hello.getClass().getClassLoader();
IHelloWorld helloProxy = (IHelloWorld)Proxy.newProxyInstance(cl, new Class[]{IHelloWorld.class}, handler);
return helloProxy;
}
public static void main(String[] args) {
IHelloWorld proxy = getHelloWoldProxy();
//调用hi()之前,调用doBefore(),hi()运行之后,调用doAfter()
String c = proxy.hi("dog");
System.out.println(c);
}
}
class DynHandler implements InvocationHandler{
//被代理者
private Class cls = null;
//被代理的实例
private IHelloWorld obj = null;
//我要代理谁
public DynHandler(IHelloWorld obj){
this.obj = obj;
}
//调用被代理的方法
/**
* args: proxy.hi传进来的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke() ..");
doBefore(args);
Object result = method.invoke(this.obj, args);
doAfter(args);
return result; //返回代理对象
}
public void doBefore(Object[] args){
System.out.println("doBefore() .." + (String)args[0]);
}
public void doAfter(Object[] args){
System.out.println("doAfter() ..");
}
}
//被代理类
class HelloWorld implements IHelloWorld{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}
//Exception in thread "main" java.lang.IllegalArgumentException: cn.util.HelloWorld is not an interface
interface IHelloWorld{
public String hi(String name);
}
//2.代理模式
public class DynamicPattern {
private Hello h;
public DynamicPattern(Hello h){
this.h=h;
}
public String sayHi(String name){
String str = h.hi(name);
System.out.println("sayHi() ..");
return str;
}
public static void main(String args[]){
DynamicPattern d = new DynamicPattern(new Hello());
String s = d.sayHi("jake");
System.out.println(s);
}
}
class Hello{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}
相关推荐
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
详细而又简单的讲述了java动态代理设计模式
在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...
代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有代码的情况下扩展功能。 **1. 代理模式的作用** - **提供间接...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
动态代理设计模式不仅限于Java,其他语言也有类似机制。例如,在.NET框架中,可以使用`System.Reflection.Emit`命名空间动态生成IL代码来创建代理,而在Python中,可以通过内置的`__getattr__`或`__getattribute__`...
动态代理设计模式是一种编程技术,它允许在运行时创建具有相同接口的新对象,该对象能够对原对象的行为进行增强或扩展。在这个模式中,代理对象作为客户端与目标对象之间的中介,代理可以添加额外的功能,如日志记录...
在这个“设计模式Java版”资料中,我们将会探讨一系列基于Java的设计模式。 首先,我们要了解设计模式的三大类:创建型模式、结构型模式和行为型模式。创建型模式包括单例模式、工厂模式(简单工厂、工厂方法、抽象...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
在Java编程领域,设计模式是一种解决常见问题的模板或最佳实践,它被广泛应用于软件开发中以提高代码的可读性、可维护性和可扩展性。代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。...
**Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...
在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...
装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...
Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...
### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...
总结来说,Java设计模式中的代理模式提供了一种优雅的方式来控制对目标对象的访问,并扩展其功能。动态代理更是使得这一过程更加灵活,降低了代码的维护成本。通过学习和应用代理模式,开发者可以更好地设计和实现...