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中,代理通常通过Java动态代理(Java Dynamic Proxy)或者Java接口代理来实现。 在给定的"proxy Java版"项目中,开发者对原有的代码进行了优化,使其兼容JDK 1.7。这是一个关键改进,因为JDK 1.7在Java社区中...
本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...
**Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....
在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...
**JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理主要基于接口来实现,也就是说,只有实现了特定接口的...
动态代理主要由两个核心类组成:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类是用于创建动态代理对象的工厂,而`InvocationHandler`接口则定义了代理对象如何处理方法调用的...
DynamicProxy dynamicProxy = new DynamicProxy(abstractSubject); AbstractSubject abstractProxy = (AbstractSubject) Proxy.newProxyInstance( abstractSubject.getClass().getClassLoader(), ...
在Java中,动态代理主要依赖于两个接口:`java.lang.reflect.InvocationHandler` 和 `java.lang.reflect.Proxy`。 `InvocationHandler` 接口定义了一个方法 `invoke()`,该方法会在代理对象的方法被调用时执行。...
Java提供了java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。这种方式下,我们无需为每个...
在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...
- **JDK动态代理(Java Dynamic Proxy)**:适用于接口代理,当被代理的目标对象实现了至少一个接口时,Spring会生成该接口的实现类作为代理。 - **CGLIB代理**:如果目标对象没有实现任何接口,Spring会使用CGLIB...
在Spring中,它主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了当代理对象的方法被调用时应如何处理的逻辑。...
在Java编程中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有特定接口的新对象。Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
Service proxyService = (Service) DynamicProxy.getProxyInstance(realService); proxyService.doSomething(); ``` 代理模式在软件开发中有广泛的应用,例如在远程调用、事务管理、缓存控制、权限验证等场景。在...
Java提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 1. **定义接口**:同样,我们首先定义一个接口。 ```java public interface Service { void execute(); } ``...
在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建动态代理实例,而 `InvocationHandler` 接口则定义了当调用代理对象的方法时应...