`

java 反射机制(四)动态代理

阅读更多
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代
理类的能力

委托类和服务接口见静态代理中的IHelloService.java与HelloServiceImpl.java
这里给出动态代理类和测试类

动态代理类:
package reflection.proxy.dynamic;

import java.lang.reflect.*;

import reflection.proxy.Static.IHelloService;

public class HelloServiceProxyFactory { // 动态代理类
	/**
	 * 创建一个实现了HelloService 接口的动态代理类的实例 参数 helloService 引用被代理的HelloService 实例
	 */
	public static IHelloService getHelloServiceProxy(
			final IHelloService helloService) {

		/*
		 * InvocationHandler 接口为方法调用接口,它声明了负责调用任意一个方法的invoke()方法:
		 * 参数proxy指定动态代理类实例,参数method指定被调用的方法,参数args 指定
		 * 向被调用方法传递的参数,invoke()方法的返回值表示被调用方法的返回值。
		 */

		// 创建一个实现了InvocationHandler接口的匿名类的实例
		InvocationHandler handler = new InvocationHandler() {
			public Object invoke(Object proxy, Method method, Object args[])
					throws Exception {
				System.out.println("before calling " + method); // 预处理
				Object result = method.invoke(helloService, args);
				// 调用被代理的HelloService 实例的方法
				System.out.println("after calling " + method); // 事后处理
				return result;
			}
		};
		Class classType = IHelloService.class;

		// public static Class<?> getProxyClass(ClassLoader loader, Class<?>[]
		// interfaces)
		// 参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现
		// 的所有接口。
		// )newProxyInstance()静态方法负责创建动态代理类的实例
		// 参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现
		// 的所有接口,参数handler 指定与动态代理类关联的InvocationHandler 对象。
		return (IHelloService) Proxy.newProxyInstance(classType
				.getClassLoader(), new Class[] { classType }, handler);
	}// # getHelloServiceProxy()
}


测试类
package reflection.proxy.dynamic;

import reflection.proxy.Static.HelloServiceImpl;
import reflection.proxy.Static.IHelloService;

public class Client2 {
	public static void main(String args[]) {
		IHelloService helloService =  new HelloServiceImpl();
		IHelloService helloServiceProxy = HelloServiceProxyFactory
				.getHelloServiceProxy(helloService);
		System.out
				.println("动态代理类的名字为" + helloServiceProxy.getClass().getName());
		System.out.println(helloServiceProxy.echo("Hello"));
	}
}


执行结果:
动态代理类的名字为$Proxy0
before calling public abstract java.lang.String reflection.proxy.Static.IHelloService.echo(java.lang.String)
after calling public abstract java.lang.String reflection.proxy.Static.IHelloService.echo(java.lang.String)
echo:Hello
分享到:
评论

相关推荐

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    JAVA反射机制与动态代理.part04

    JAVA反射机制与动态代理.part04

    JAVA 反射机制与动态代理ppt

    总的来说,Java反射机制和动态代理是Java平台强大而灵活的特性,它们使得Java程序能够在运行时具有更高的灵活性和可扩展性。然而,使用反射也可能带来性能开销和安全风险,因此在实际应用中需要权衡利弊,合理使用。

    java 反射机制与动态代理

    Java反射机制与动态代理是Java编程中的重要概念,它们在软件设计中扮演着核心角色,尤其是在框架开发中。本文将深入探讨这两个主题,以及如何在实际应用中利用它们。 首先,我们来理解Java反射机制。反射是Java的一...

    Java反射机制与动态代理

    总结来说,Java反射机制和动态代理是Java编程中不可或缺的部分,它们极大地扩展了Java的灵活性和可扩展性,使得程序员可以在运行时对程序进行更深层次的控制。了解和熟练掌握这两项技术,对于提高Java开发能力和解决...

    Java反射机制和动态代理

    主要讲述Java反射机制与设计模式之一:代理模式的原理与应用;同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践。

    JAVA反射机制与动态代理

    1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...

    JAVA反射机制与动态代理.part01

    JAVA反射机制与动态代理.part01

    JAVA反射机制与动态代理.part02

    JAVA反射机制与动态代理.part02

    JAVA反射机制与动态代理.part05

    JAVA反射机制与动态代理.part05

    JAVA反射机制与动态代理.part03

    JAVA反射机制与动态代理.part03

Global site tag (gtag.js) - Google Analytics