与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由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反射机制与动态代理.part04
总的来说,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反射机制与动态代理.part02
JAVA反射机制与动态代理.part05
JAVA反射机制与动态代理.part03