1 先看一个简单点动态代理的例子(没有用到factory)
2 1 定义接口
3 package com.dynamic.simple;
4
5 import com.dynamic.simple.Subject;
6
7 public interface Subject{
8 public void request();
9 }
10
11 2 实现真实类
12 package com.dynamic.simple;
13
14 public class RealSubject implements Subject{
15 public RealSubject(){}
16 public void request() {
17 System.out.println("From real subject.");
18 }
19 }
20
21 3 定义动态代理
22 package com.dynamic.simple;
23
24 import java.lang.reflect.Method;
25 import java.lang.reflect.InvocationHandler;
26 public class DynamicSubject implements InvocationHandler {
27 private Object sub;
28
29 public DynamicSubject() {
30 }
31
32 public DynamicSubject(Object obj) {
33 sub = obj;
34 }
35
36 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
37 System.out.println("before calling " + method);
38 method.invoke(sub,args);
39 System.out.println("after calling " + method);
40 return null;
41 }
42 }
43
44 4 客户端
45 package com.dynamic.simple;
46
47 import java.lang.reflect.InvocationHandler;
48 import java.lang.reflect.Proxy;
49
50 public class Client{
51 static public void main(String[] args) throws Throwable{
52 RealSubject rs = new RealSubject(); //在这里指定被代理类
53 InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
54 Class cls = rs.getClass();
55 Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds );
56 subject.request();
57 }
58 }
运行客户端结果为:
before calling public abstract void com.dynamic.simple.Subject.request()
From real subject.
after calling public abstract void com.dynamic.simple.Subject.request()
1 下面看一个复杂点的动态代理实现(用到了factory)
2 1 定义接口
3 package com.proxy;
4
5 import com.proxy.SomeClass;
6 import com.proxy.SomeClassImpl;
7
8 public interface SomeClass {
9 public void someMethod();
10
11 public void someOtherMethod(final String text);
12 }
13
14 2 定义实现类
15 package com.proxy;
16
17
18 public class SomeClassImpl implements SomeClass{
19 private String name;
20
21 public SomeClassImpl(final String name){
22 this.name = name;
23 }
24
25 public void someMethod(){
26 System.out.println(this.name);
27 }
28
29 public void someOtherMethod(final String text){
30 System.out.println(text);
31 }
32 }
33
34 3 定义2个代理SomeClassProxy和SomeClassCountingProxy(静态代理时才需要)
35 /*SomeClassProxy*/
36 package com.proxy;
37
38
39 public class SomeClassProxy implements SomeClass{
40
41 private final SomeClassImpl impl;
42
43 public SomeClassProxy(SomeClassImpl impl){
44 this.impl = impl;
45 }
46
47 public void someMethod(){
48 this.impl.someMethod();
49 }
50
51 public void someOtherMethod(final String text){
52 this.impl.someOtherMethod(text);
53 }
54 }
55
56 /*SomeClassCountingProxy*/
57 package com.proxy;
58
59
60 public class SomeClassCountingProxy implements SomeClass{
61 private final SomeClassImpl impl;
62
63 private int invocationCount = 0;
64
65 public SomeClassCountingProxy(SomeClassImpl impl){
66 this.impl = impl;
67 }
68
69 public void someMethod(){
70 this.invocationCount ++;
71 this.impl.someMethod();
72 }
73
74 public void someOtherMethod(final String text){
75 this.invocationCount ++;
76 this.impl.someOtherMethod(text);
77 }
78
79 public int getInvocationCount() {
80 return invocationCount;
81 }
82
83 public void setInvocationCount(int invocationCount) {
84 this.invocationCount = invocationCount;
85 }
86 }
87
88 4 定义工厂
89 package com.proxy;
90
91 import java.lang.reflect.InvocationHandler;
92 import java.lang.reflect.Proxy;
93
94
95 public class SomeClassFactory {
96 /*//static proxy
97 public static final SomeClass getStaticSomeClassProxy(){
98 SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
99 if (false) {//generally when debuging
100 return new SomeClassCountingProxy(impl);
101 } else {
102 return new SomeClassProxy(impl);
103 }
104 }
105 */
106
107 //dynamic proxy
108 public static final SomeClass getDynamicSomeClassProxy(){
109 SomeClassImpl impl = new SomeClassImpl(System.getProperty("user.name"));
110 ClassLoader loader = SomeClassImpl.class.getClassLoader();
111 Class[] interfaces = new Class[] {SomeClass.class};
112 InvocationHandler handler = new MethodCountingHandler(impl);
113 SomeClass proxy = (SomeClass)Proxy.newProxyInstance(loader, interfaces, handler);
114 return proxy;
115 }
116 }
117
118 5 定义InvocationHandler,主要通过这个类实现动态代理功能及其扩展
119 package com.proxy;
120
121 import java.lang.reflect.InvocationTargetException;
122 import java.lang.reflect.InvocationHandler;
123 import java.lang.reflect.Method;
124
125
126 public class MethodCountingHandler implements InvocationHandler{
127
128 private final Object impl;
129 private int invocationCount = 0;
130
131 public MethodCountingHandler(final Object impl){
132 this.impl = impl;
133 }
134
135 public int getInvocationCount(){
136 return invocationCount;
137 }
138
139 @Override
140 public Object invoke(Object proxy, Method method, Object[] args)
141 throws Throwable {
142 try {
143 this.invocationCount++;
144 Object result = method.invoke(impl, args);
145 return result;
146 } catch (final InvocationTargetException e) {
147 throw e.getTargetException();
148 }
149 }
150 }
151
152
153 6 定义客户端
154 package com.proxy;
155
156 import java.lang.reflect.InvocationHandler;
157 import java.lang.reflect.Proxy;
158
159
160 public class DemoDynamic {
161
162 /**
163 * @param args
164 */
165 public static void main(String[] args) {
166 /*//no use factory
167 SomeClassImpl real = new SomeClassImpl(System.getProperty("user.name"));
168 InvocationHandler dynamic = new MethodCountingHandler(real);
169 Class clz = real.getClass();
170 SomeClass obj = (SomeClass)Proxy.newProxyInstance(clz.getClassLoader(), clz.getInterfaces(), dynamic);
171 obj.someMethod();
172 obj.someOtherMethod("test");
173 */
174
175 //use factory to get a real object
176 SomeClass obj = (SomeClass)SomeClassFactory.getDynamicSomeClassProxy();
177 obj.someMethod();
178 obj.someOtherMethod("test");
179
180 //the invocationhandler works as proxy function, extend the function of real object
181 InvocationHandler handler = Proxy.getInvocationHandler(obj);
182 if (handler instanceof MethodCountingHandler) {
183 System.out.println(((MethodCountingHandler)handler).getInvocationCount());
184 }
185 }
186 }
运行结果为:
Administrator
test
2
参照链接:
http://blog.csdn.net/goodluckforlove/archive/2009/10/13/4663079.aspx
分享到:
相关推荐
以下是一个简单的Java动态代理和CGLIB代理的例子: ```java // 目标接口 public interface MyService { void doSomething(); } // 目标实现 public class MyServiceImpl implements MyService { @Override ...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...
1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...
1. 动态生成:代理类是在运行时生成的,不需要预先编写具体的代理类代码。 2. 灵活性:可以为任何实现了特定接口的对象创建代理,添加额外的行为。 3. 透明性:代理类和原始对象实现了相同的接口,调用者无需知道是...
invoke()方法接受三个参数:代理对象、被调用的方法以及方法调用时的参数。 - 你可以自定义一个InvocationHandler实现类,覆盖invoke()方法,在其中添加额外的逻辑,如记录日志、性能计时等。 3. **创建动态代理...
JAVA动态代理的例子 一个简单的例子 初学者可以下载试试
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...
它接收三个参数:代理对象、被调用的方法和方法调用时的参数。你需要在这个方法内实现具体的行为,如调用原始对象的方法、添加额外的操作等。 动态代理的基本步骤如下: 1. 定义一个或多个接口,这些接口将由代理...
这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...
在Java中,我们可以使用两种主要的方式来实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: - JDK动态代理基于接口实现,它要求被代理的目标对象必须实现至少一个接口。代理类会在运行时动态创建...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
在Java中,动态代理是实现委托模式的一种常见方式,它允许我们在运行时创建具有特定接口的代理类实例。下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本...
而动态代理则是在运行时动态生成代理类,通常使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理常用于事件处理、事务管理、日志记录等场景,它可以在方法调用前后添加...
Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...
Java试题-2:ArrayList类动态代理 什么是动态代理 动态代理该怎么实现
静态代理是通过手动创建代理类来实现的,而动态代理则是利用Java的反射API在运行时动态创建代理类。 在Java 1.5之后,引入了`java.lang.instrument`包,提供了对Java应用程序进行字节码级别操作的能力,从而实现...
下面是一个简单的Java动态代理实现例子,我们创建一个`MyService`接口和一个实现了该接口的`RealMyService`类。然后通过动态代理,我们可以为`RealMyService`添加日志功能。 ```java interface MyService { ...
spring framework入门(6):java中的动态代理(jdk和cglib) 博客地址:https://blog.csdn.net/u010476739/article/details/76737460
语言程序设计资料:Java2程序设计例子源代码-经典源码.doc