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 ...
4. **使用代理对象**:代理对象可以直接调用目标类的方法,内部会自动触发我们在`intercept()`方法中定义的行为。 总结来说,Java动态代理为我们提供了一种灵活的方式,可以在运行时扩展或改变对象的行为,无需修改...
Java动态代理在电信资源管理系统中的研究 Java动态代理是一种重要的编程技术,在电信资源管理系统中扮演着关键的角色。通过使用Java动态代理,可以解决资源管理系统中的高耦合问题,提高系统的可维护性和可扩展性。...
这个方法接收三个参数:代理对象、调用的方法以及方法的参数,可以根据需要执行自定义逻辑。 3. **Proxy类**: `Proxy`类是Java动态代理的工厂,通过`newProxyInstance()`方法创建代理对象。该方法需要传入三个...
总结来说,Java的静态代理适用于代理类较少且代理逻辑相对固定的情况,而动态代理则在代理类数量不确定或者代理逻辑可能变化时更为合适。两者都可以实现为原始对象添加附加功能,但动态代理在灵活性和代码维护方面...
1. 动态生成:代理类是在运行时生成的,不需要预先编写具体的代理类代码。 2. 灵活性:可以为任何实现了特定接口的对象创建代理,添加额外的行为。 3. 透明性:代理类和原始对象实现了相同的接口,调用者无需知道是...
invoke()方法接受三个参数:代理对象、被调用的方法以及方法调用时的参数。 - 你可以自定义一个InvocationHandler实现类,覆盖invoke()方法,在其中添加额外的逻辑,如记录日志、性能计时等。 3. **创建动态代理...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“中间人”,在调用原有方法前或后执行额外的操作,如日志记录、性能监控、事务管理等。动态代理在很多...
它接收三个参数:代理对象、被调用的方法和方法调用时的参数。你需要在这个方法内实现具体的行为,如调用原始对象的方法、添加额外的操作等。 动态代理的基本步骤如下: 1. 定义一个或多个接口,这些接口将由代理...
这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...
在Java中,我们可以使用两种主要的方式来实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: - JDK动态代理基于接口实现,它要求被代理的目标对象必须实现至少一个接口。代理类会在运行时动态创建...
而动态代理则是在运行时动态生成代理类,通常使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理常用于事件处理、事务管理、日志记录等场景,它可以在方法调用前后添加...
- Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。 - `Proxy`类用于创建一个代理对象,而`InvocationHandler`接口定义了调用处理程序,它...
Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...
静态代理是通过手动创建代理类来实现的,而动态代理则是利用Java的反射API在运行时动态创建代理类。 在Java 1.5之后,引入了`java.lang.instrument`包,提供了对Java应用程序进行字节码级别操作的能力,从而实现...
语言程序设计资料:Java2程序设计例子源代码-经典源码.doc
`invoke()`方法有三个参数:代理对象、被调用的方法和方法调用的参数。开发人员需要在这个方法内实现自定义逻辑,比如日志记录、事务管理或者性能监控等。 接下来,我们来看看如何创建一个简单的动态代理示例,对应...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“代理”,在调用原有方法时添加额外的功能或行为。这一技术在软件开发中广泛应用,特别是在实现设计模式...
InvocationHandler接口定义了一个invoke()方法,该方法接收三个参数:代理对象、调用的方法以及方法的参数。在invoke()方法内部,我们可以实现任何我们想要的逻辑,比如添加日志、性能监控、事务控制等,然后再调用...