动态代理(1)----JDK动态代理 (二)

2014-11-24 11:50:02 · 作者: · 浏览: 28
n("正在执行的方法:"+method);
if(args!=null){
System.out.println("下面是执行该方法时传入的实参:");
for(Object val:args){
System.out.println(val);
}
}else{
System.out.println("调用该方法无须实参");
}
return null;
}
}
public class ProxyTest {
public static void main(String[] args) throws Exception{
//创建一个InvocationHandler对象
InvocationHandler handler=new MyInvokationHandler();
//使用指定的InvocationHanlder来生成一个动态代理对象
PersonPro p=(PersonPro)Proxy.newProxyInstance(PersonPro.class.getClassLoader(), new Class[]{PersonPro.class}, handler);
//调用动态代理对象的walk()方法和sayHello()方法
p.walk();
p.sayHello("luck");
}
}
interface PersonPro{
void walk();
void sayHello(String name);
}
class MyInvokationHandler implements InvocationHandler{
/*
* 执行动态代理对象的所有方法时,都会被替换成执行如下invoke方法
* 其中:
* proxy--代表动态代理对象
* method--代表正在执行的方法
* args--代表执行代理对象方法时传入的实参
*/
public Object invoke(Object proxy,Method method,Object[] args){
System.out.println("正在执行的方法:"+method);
if(args!=null){
System.out.println("下面是执行该方法时传入的实参:");
for(Object val:args){
System.out.println(val);
}
}else{
System.out.println("调用该方法无须实参");
}
return null;
}
}
上面程序中提供了一个Person接口,该接口中包含了walk和sayHello两个抽象方法,接着程序定义了一个简单的InvocationHandler实现类,定义该实现类时需要重写invoke方法----执行代理对象所有方法执行时将会替换成执行此invoke方法.
从运行结果中可以看出,不管程序执行代理对象的walk()方法,还是执行代理对象的sayHello()方法,实际上都是执行InvocationHandler对象的invoke()方法.