`

java动态代理- 三

    博客分类:
  • j2se
阅读更多

 

Java代码 复制代码
  1. public interface HelloWorld {   
  2.     void sayHelloWorld();   
  3. }  
public interface HelloWorld {
	void sayHelloWorld();
}

 
 
业务接口实现:

Java代码 复制代码
  1. public class HelloWorldImpl implements HelloWorld {   
  2.     public void sayHelloWorld() {   
  3.         System.out.println("Hello World!");                
  4.     }   
  5. }  
public class HelloWorldImpl implements HelloWorld {
	public void sayHelloWorld() {
		System.out.println("Hello World!");             
	}
}

 
 

InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:

Java代码 复制代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3.   
  4. public class HelloWorldHandler implements InvocationHandler {   
  5.   
  6.     //要代理的原始对象   
  7.     private Object objOriginal;   
  8.     /**  
  9.      * 构造函数。  
  10.      * @param obj 要代理的原始对象。  
  11.      */  
  12.     public HelloWorldHandler(Object obj) {   
  13.         this.objOriginal = obj ;   
  14.     }   
  15.   
  16.     /**  
  17.      * 当调用原始对象的方法时,代理执行的方法  
  18.      * @param proxy 代理对象  
  19.      * @param method 要执行的原始对象方法  
  20.      * @param args 原始对象方法的参数值组  
  21.      * @return 原始对象方法执行的返回值  
  22.      */  
  23.     public Object invoke(Object proxy, Method method, Object[] args)   
  24.         throws Throwable {   
  25.             Object result ;    
  26.             //方法调用之前   
  27.             doBefore();   
  28.             //调用原始对象的方法   
  29.             result = method.invoke(this.objOriginal ,args);   
  30.             //方法调用之后   
  31.             doAfter();   
  32.             return result ;   
  33.     }   
  34.     /**  
  35.      * 方法调用之前执行的方法  
  36.      */  
  37.     private void doBefore() {   
  38.         System.out.println("before method invoke!");   
  39.     }   
  40.        
  41.     /**  
  42.      * 方法调用之后执行的方法  
  43.      */  
  44.     private void doAfter() {   
  45.         System.out.println("after method invoke!");   
  46.     }   
  47. }   
  48.   
  49. 测试代码:   
  50.   
  51. import java.lang.reflect.InvocationHandler;   
  52. import java.lang.reflect.Proxy;   
  53.   
  54. public class Test {   
  55.     public static void main(String[] args) {   
  56.         HelloWorld hw = new HelloWorldImpl();   
  57.                  
  58.         InvocationHandler handler = new HelloWorldHandler(hw);   
  59.                  
  60.         HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(    
  61.             hw.getClass().getClassLoader(),    
  62.             hw.getClass().getInterfaces(),    
  63.             handler);    
  64.         proxy.sayHelloWorld();   
  65.     }   
  66. }  
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

	//要代理的原始对象
	private Object objOriginal;
	/**
	 * 构造函数。
	 * @param obj 要代理的原始对象。
	 */
	public HelloWorldHandler(Object obj) {
		this.objOriginal = obj ;
	}

	/**
	 * 当调用原始对象的方法时,代理执行的方法
	 * @param proxy 代理对象
	 * @param method 要执行的原始对象方法
	 * @param args 原始对象方法的参数值组
	 * @return 原始对象方法执行的返回值
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {
			Object result ; 
			//方法调用之前
			doBefore();
			//调用原始对象的方法
			result = method.invoke(this.objOriginal ,args);
			//方法调用之后
			doAfter();
			return result ;
	}
	/**
	 * 方法调用之前执行的方法
	 */
	private void doBefore() {
		System.out.println("before method invoke!");
	}
	
	/**
	 * 方法调用之后执行的方法
	 */
	private void doAfter() {
		System.out.println("after method invoke!");
	}
}

测试代码:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
	public static void main(String[] args) {
		HelloWorld hw = new HelloWorldImpl();
              
		InvocationHandler handler = new HelloWorldHandler(hw);
              
		HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( 
			hw.getClass().getClassLoader(), 
			hw.getClass().getInterfaces(), 
			handler); 
		proxy.sayHelloWorld();
	}
}

  
 

1.首先获取一个业务接口的实现对象;

2.获取一个InvocationHandler实现,此处是HelloWorldHandler对象;

3.创建动态代理对象;

4.通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。

运行测试类输出如下:

before method invoke!
Hello World!
after method invoke!
 
此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。

分享到:
评论

相关推荐

    java动态代理demo

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...

    java动态代理实例

    3. **拦截器模式**:在Java动态代理中,我们可以使用`InvocationHandler`来实现拦截器。拦截器是一种设计模式,它允许我们在方法调用前后插入自定义的代码,比如事务管理、权限检查等。通过动态代理,我们可以轻松地...

    java动态代理 经典文章(word 2007格式的)

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理主要应用于面向切面编程(AOP)和事件监听等场景,使得代码更加模块化,易于维护。以下是...

    java事务 - 使用动态代理

    - Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。 - `Proxy`类用于创建一个代理对象,而`InvocationHandler`接口定义了调用处理程序,它...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    8. **代理模式(Proxy Pattern)**:为其他对象提供一种代理以控制对这个对象的访问,比如远程代理、虚拟代理、缓存代理等。 9. **桥接模式(Bridge Pattern)**:将抽象部分与它的实现部分分离,使它们都可以独立...

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...

    java 动态代理 简单实例

    Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用方法时添加额外的功能或控制。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等。...

    java + 动态代理 + 动态代理实际应用场景

    3: 动态代理使用到基础理论:ClassLoader 加载.class字节码文件得到 , Class对象, Class对象通过 newProxyInstance 得到代理对象 4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。

    java 动态代理实现AOP

    #### 三、Java动态代理概述 Java动态代理是Java语言提供的一个强大的特性,它允许开发者在运行时创建代理对象,以实现对目标对象的方法调用拦截。动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang....

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

    Java实现动态代理

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    动态代理-jdk、cglib、javassist.zip

    动态代理在Java编程中是一种非常重要的技术,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,为对象添加额外的...理解并掌握这三种动态代理技术,对于提升Java编程的灵活性和效率具有重要意义。

    java动态代理(3)

    Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象来代替目标对象,以便在不修改原有代码的情况下对目标对象的行为进行增强或扩展。在Java.lang.reflect包下,动态代理主要涉及两个核心...

    java动态代理实现详解

    1. `java.lang.reflect.Proxy`:这个类是Java动态代理的基石,提供了生成代理类和实例的方法。`newProxyInstance()`方法是关键,它接受类加载器、接口列表和一个实现了`InvocationHandler`的实例作为参数,返回代理...

    Java 反射-动态代理

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

Global site tag (gtag.js) - Google Analytics