`
忆梦竹
  • 浏览: 65828 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Java Dynamic Proxy (Java 动态代理)

    博客分类:
  • JAVA
阅读更多
   今天,自己学习了下javaAPI的动态代理,并查阅了网上的一些关于动态代理的文章。有心把自己的理解写下。
    动态代理最重要是有一个Proxy类,还有一个InvocationHandler接口。一般理解了这两个那么对于动态代理应该也就理解了。
     Proxy类里面有一个方法是newPorxyInstance(ClassLoader loader,Class<?>[] interfaces , InvocationHandler h) throws IllegalArgumentException.
这个方法是用于创建一个proxy对象,
    至于参数loader可以是装载我们的目标类(待会说明)或者目标类所实现的接口的类装载器。
    interfaces是我们要创建的那个proxy所要实现的那些接口。
    h 则是与我们要创建的这个proxy绑定的执行处理器(InvocationHandler)。
每一个proxy的实例都有一个与之绑定的执行处理器,并且当该proxy执行一个方法的时候,他会把这个方法的执行分配给这个执行处理器的invoke方法去执行。接着就要谈谈执行处理器(InvocationHandler)了。
    InvocationHandler接口里面有一个invoke方法。里面的参数我也就不一一说明了,大家可以看看API里面的说明,因为我也是看API的。这篇文章几乎都是API里面的内容。提醒一点就是每一个InvocationHandler的实现类里面都有应该要保留一个目标类的一个引用,以便调用方法的时候可以用到。接下来我用一个实例说明一下。

package com.vocation.test.proxy;

public interface Realizable { //这个接口是目标类和proxy应该共同实现的接口。
	public void doThings(String process);
}

package com.vocation.test.proxy;


下面这个是一个目标类实现了上面的接口。上面提到的loader可以是装在我们这个目标类所使用的classLoader。
public class Target implements Realizable {

	@Override
	public void doThings(String process) {
		System.out.println(process);
	}
}



下面这个类则是用来对从客户端到目标类的额外处理。相当于一个过滤的中间处理层吧。

package com.vocation.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TargetHandler implements InvocationHandler{
	private Object target ;//目标类的一个应用以便下面invoke方法中method的invoke方法使用。
	
	public TargetHandler(){
		
	}
	public TargetHandler(Object target) {
		this.target = target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("I am dreaming ...");
		method.invoke(target, args);
		System.out.println("My dream come true ...");
		return null;
	}
}



最后我们看看我们的客户端怎样来调用。

package com.vocation.test.proxy;

import java.lang.reflect.Proxy;

public class StartLife {
	public static void main(String [] args) {
		//创建一个目标类
		Target target = new Target();
		//创建一个处理目标类的方法的一个处理器
		TargetHandler targetHandler = new TargetHandler(target);
		//ClassLoader也可以是装载目标类的装载器,Class数组是要创建的这个proxy实例所要实现的所有接口,InvocationHandler是我们用来处理目标类的处理器。
		Realizable realizableTarget = (Realizable)Proxy.newProxyInstance(Realizable.class.getClassLoader(), new Class[] {Realizable.class}, targetHandler);
		//直接调用代理类的方法,然后该代理类会把方法的执行分配给其绑定的执行处理器的invoke方法去执行。
		realizableTarget.doThings("I am working hard, working hard, working hard ...");
	}
}



以下是执行的结果:
I am dreaming ...
I am working hard, working hard, working hard ...
My dream come true ...

如果需要更详细的信息,希望大家参考API。


1
4
分享到:
评论

相关推荐

    java reflect and dynamic proxy .Java反射和动态代理

    **Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....

    反射与动态代理Reflection&DynamicProxy.zip

    Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...

    Java静态代理与动态代理demo

    在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...

    08spring4_dynamicproxy.rar

    package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...

    proxy.rar java三种代理模式源码

    在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...

    Java动态代理Proxy和cglib

    在Java编程中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有特定接口的新对象。Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

    Java动态代理语法Proxy类原理详解

    在上面的示例中,我们定义了一个动态代理类DynamicProxy,它实现了InvocationHandler接口。我们可以通过DynamicProxy对象来代理RealSubject对象,并对其方法调用进行处理和修改。 四、结论 Java动态代理语法Proxy...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    java 静态代理和动态代理学习实例源码

    Java提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 1. **定义接口**:同样,我们首先定义一个接口。 ```java public interface Service { void execute(); } ``...

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

    2. 在`DynamicProxy`类中定义`getDynamicProxy`静态方法,使用`Proxy.newProxyInstance()`方法创建动态代理实例。 3. `DynamicProxy`类重写`invoke`方法,在调用目标对象方法前后的操作,比如记录日志或性能监控。 ...

    Java-Dynamic-Proxy:动态代理实现

    在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建动态代理实例,而 `InvocationHandler` 接口则定义了当调用代理对象的方法时应...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Java通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。动态代理的优势在于,我们不需要为每个目标类都创建一个代理类,只需要一个代理类就能代理多个实现了相同接口的...

    JDK动态代理proxy

    JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...

    Java 反射-动态代理

    接下来,我们讨论Java动态代理(Dynamic Proxy)。动态代理是在运行时创建代理类和代理对象,这些代理对象可以代替目标对象执行某些操作,同时提供额外的功能,如日志记录、事务管理等。Java提供两种方式实现动态...

    proxy Java版

    在Java中,代理通常通过Java动态代理(Java Dynamic Proxy)或者Java接口代理来实现。 在给定的"proxy Java版"项目中,开发者对原有的代码进行了优化,使其兼容JDK 1.7。这是一个关键改进,因为JDK 1.7在Java社区中...

    java语言反射与动态代理学习笔记2(动态代理部分)

    **动态代理(Dynamic Proxy)** 动态代理是在运行时动态创建具有特定接口实现的代理对象。Java提供了一套API,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,来支持动态代理的实现。 ...

    java 动态代理的前世今生

    java 动态代理的前世今生 dynamic proxy in java

    Java静态代理和动态代理

    Java提供了一种称为Java反射API(java.lang.reflect包)的机制来实现动态代理。 1. **获取InvocationHandler**: 首先,我们需要实现`java.lang.reflect.InvocationHandler`接口,其中的`invoke()`方法将在代理类...

    Java中的代理模式Demo

    2. 动态代理:Java提供了`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口来实现动态代理。动态代理在运行时创建代理类,无需预先编写代理类的代码。这使得代理类能根据需要动态扩展或添加...

Global site tag (gtag.js) - Google Analytics