1) Act as a simple log interceptor:
public class DynamicProxy { private static final Logger logger = Logger.getLogger(DynamicProxy.class); @SuppressWarnings("unchecked") @Test public void useProxyTest() { String str = "Hello world"; LoggingInvocationHandler handler = new LoggingInvocationHandler(str); Comparable<String> obj = (Comparable<String>) Proxy.newProxyInstance( this.getClass().getClassLoader(), new Class[]{Comparable.class}, handler); obj.compareTo("Yes"); } public static class LoggingInvocationHandler implements InvocationHandler { private Object targetObject; public LoggingInvocationHandler(Object targetObject) { this.targetObject = targetObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { logger.info(String.format("Invoking method: [%s], args: [%s]", method.getName(), Lists.newArrayList(args))); return method.invoke(targetObject, args); } } }
2) Act as a simple adapter between two different interfaces:
public class DynamicProxy { private static final Logger logger = Logger.getLogger(DynamicProxy.class); public static interface GreetV1 { String greet(String name, String gender) throws IOException; } public static interface GreetV2 { String greet(String username); } public class GreetAdapter implements InvocationHandler { private GreetV1 greetInstance; public GreetAdapter(GreetV1 greetInstance) { super(); this.greetInstance = greetInstance; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if ("greet".equals(methodName)) { String username = (String) args[0]; String name = lookupName(username); String gender = lookupGender(username); logger.info(proxy.getClass()); // ((GreetV2)proxy).greet(username); try { return greetInstance.greet(name, gender); } catch (Exception e) { throw new RuntimeException(e); } } else { return method.invoke(greetInstance, args); } } private String lookupGender(String username) { // Dummy return "Male"; } private String lookupName(String username) { // Dummy return "Yang"; } } @Test public void adapterTest() { GreetAdapter adapter = new GreetAdapter(new GreetV1() { @Override public String greet(String name, String gender) throws IOException { return String.format("Hello %s[%s]", name, gender); } }); GreetV2 greetV2 = (GreetV2) Proxy.newProxyInstance(this.getClass() .getClassLoader(), new Class[]{GreetV2.class}, adapter); assertEquals("Hello Yang[Male]", greetV2.greet("Yang, Kunlun")); logger.info(greetV2.getClass()); } }
The first argument "proxy" in method invoke() is actually the "greetV2" instance.
greetV2 is indeed an instance of an anonymous class who extends java.lang.reflect.Proxy and implements GreetV2 interface.
And it has an InvocationHandler property which points to "adapter".
If we decomment the "((GreetV2)proxy).greet(username)", the "java.lang.StackOverflowError" will occur.
See simplified Proxy code below:
public class Proxy implements java.io.Serializable { protected InvocationHandler h; protected Proxy(InvocationHandler h) { this.h = h; // As the dynamically generated class extends Proxy, therefore it has this InvocationHandler property. } public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) { final Constructor<?> cons = cl.getConstructor(constructorParams); final InvocationHandler ih = h; return newInstance(cons, ih); // creates a new instance that extends java.lang.reflect.Proxy and implements the interfaces passed in. } }
Reference Links:
http://guojuanjun.blog.51cto.com/277646/1221281
http://paddy-w.iteye.com/blog/841798
相关推荐
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 ...
java 反射与动态代理Reflection&DynamicProxy,源码展示
NULL 博文链接:https://lionkingzw-hotmail-com.iteye.com/blog/485923
java static proxy dynamic proxy
JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy
动态代理一个简单实用的JDK动态代理演示
java 动态代理的前世今生 dynamic proxy in java
Java动态代理 动态代理实现
<artifactId>dynamicproxy <version>1.0.0 接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时...
└─dynamicproxy └─src └─com └─dynamicproxy ├─entity │ Subject.java │ ├─entityimpl │ SubjectImpl.java │ ├─main │ Test.java │ └─proxy AbstractDynamicProxy.java ...
因目前公司客户端采用delphi7开发,与服务器...本例采用Dynamic Proxy方式,WSDD方式 delphiclient 是用delphi7写的WebService客户端 里面的地址请根据实际情况调整 效果很简单,点一下访问Webservice弹出一个对话框
import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Vector; public class ProxyTest { public static void main(String[] args) { System.out.println(Integer.class.getClassLoader...
Mature AOP tools like PostSharp and Castle DynamicProxy now offer .NET developers the level of support Java coders have relied on for years. About this Book AOP in .NET introduces aspect-oriented ...
spring_dynamic_proxy:基于接口基于子类的动态代理
java_base Java语言及高级特性学习工程目录base_...super_class:super()方法替换执行父类的无参构造函数useClass:类类的使用dynamic_proxy java JDK及第三方库CGLIB实现的两个动态代理socket_proj java socket编程
本文的标签:1,aop,dynamic,java,proxy, 动态代理,动态代理机制分析及扩展,动态代理机制分析及扩展,第,部分标记本文!Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及...
一个基于Java的代理,可动态转换现有Web应用程序中HTML,以提供XML数据和XML-RPC服务,而无需修改Web应用程序。 一种格式实现了在研究生论文中讨论的称为RMA的算法。
java7 源码 test1 版本更新 ...14、java核心技术第二章源码--com.java7book.chapter2.dynamicproxy. 15、方法句柄的例子--invoke包。 16、方法句柄的使用--TestInvoke. 17、excle的读取--TestExcel.java