用Java动态代理实现委托模式
来源:互联网 发布:excel2010编程入门教程 编辑:程序博客网 时间:2024/05/17 03:16
InvocationHandler 用于实现代理。
如果不用InvocationHandler接口实现代理的话,我们写代码是这样的:
定义一个接口:
Java code
interface Greet
{
void sayHello(String name);
void goodBye();
}
实现这个接口:
Java code
class GreetImpl implements Greet
{
public void sayHello(String name)
{
System.out.println("Hello " + name);
}
public void goodBye()
{
System.out.println("Good bye.");
}
}
实现一个代理类
Java code
public class SimpleProxy implements Greet
{
private Greet greet = null;
SimpleProxy(Greet greet)
{
this.greet = greet;
}
public void sayHello(String name)
{
System.out.println("--before method sayHello");
greet.sayHello(name);
System.out.println("--after method sayHello");
}
public void goodBye()
{
System.out.println("--before method goodBye");
greet.goodBye();
System.out.println("--after method goodBye");
}
/**
* @param args
*/
public static void main(String[] args)
{ Greet tmp = new GreetImpl(); //生成代理
Greet greet = new SimpleProxy(tmp);
greet.sayHello("walter");
greet.goodBye();
}
}
===============================================================================
代理其实没什么的,再看看如果实现了InvocationHandler接口,
我们怎样实现代理。
还是要实现原来的Greet接口。
接口的实现还是GreetImpl。
Java code
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class DebugProxy implements java.lang.reflect.InvocationHandler
{
private Object obj;
public static Object newInstance(Object obj)
{
return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new DebugProxy(obj));
}
private DebugProxy(Object obj)
{
//Greet接口的實現:GreetImpl
this.obj = obj;
}
//Method m:調用的方法
//Object[] args:方法要傳入的參數 //invoke实现对GreetImpl中方法的调用,同时也可以在这里加入自己想要实现的操作, //虽然调用原GreetImpl中的方法重要,但我想这里更看重的是通过自定义处理实现GreetImpl中没有的功能
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
{
Object result;
try
{
//自定義的處理
System.out.println("--before method " + m.getName());
//調用GreetImpl中方法
result = m.invoke(obj, args);
}catch(InvocationTargetException e)
{
throw e.getTargetException();
}catch(Exception e)
{
throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
}finally
{
System.out.println("--after method " + m.getName());
}
return result;
}
/**
* @param args
*/
public static void main(String[] args)
{
Greet tmp = new GreetImpl();
Greet greet = (Greet) DebugProxy.newInstance(tmp);
//生成的greet和tmp有相同的hashCode
//通过DebugProxy构造的greet比原temp拥有更多功能
greet.sayHello("walter");
greet.goodBye();
}
}
- 用Java动态代理实现委托模式
- 用Java动态代理实现委托模式
- Java动态代理(代理模式/委托模式)
- Java实现代理模式(动态代理)
- 代理模式及Java实现动态代理
- 代理模式及Java实现动态代理
- java中实现代理及委托代理模式
- java中实现代理及委托代理模式
- 设计模式:用Java动态代理实现AOP
- 动态代理模式的Java实现
- Java动态代理模式理解和实现
- java反射实现动态代理模式
- 设计模式-java实现动态代理
- 代理模式之动态代理(java实现)
- java 代理模式,JDK动态代理,SpringAOP的实现
- Java代理模式2 - JDK动态代理实现
- Java代理模式3 - cglib动态代理实现
- java动态代理对代理模式的实现
- OAF个性化开发实例
- linux kernel 的hash散列函数 : hash_long
- 刚做了Morgan Stanley IT部门Summer Intern的online test
- 使用Enumeration检查页面PPR事件
- 再议OAF中的记录历史(Record History)功能
- 用Java动态代理实现委托模式
- hdu1827强连通+缩点
- Form个性化+OAF+BIPublisher实现即时打印
- Ubuntu上安装HADOOP多机完全分布式集群
- win7 gtk+ Geany 使用
- 计算机硬件发展趋势——我的看法
- hdu 3853 LOOPS 概率dp
- Thinking about KVC/KVO
- Nvidia实习笔试杯具了T T