接口
package com.test.proxy;
public interface IHello {
public void sayHello();
}
具体实现类
package com.test.proxy;
public class Hello implements IHello {
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello world vinthy");
}
}动态代理类及测试
package com.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHello implements InvocationHandler {
private Object obj;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object returnObject = null;
System.out.println("before..");
returnObject = method.invoke(obj, args);
System.out.println("after..");
return returnObject;
}
public void bind(Object obj) {
this.obj = obj;
}
/**
* @param args
*/
public static void main(String[] args) {
ProxyHello proxy = new ProxyHello();
//由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法
IHello hello =(IHello) Proxy.newProxyInstance(Hello.class.getClassLoader(), Hello.class.getInterfaces(), proxy);
proxy.bind(new Hello());
hello.sayHello();
}
}
//由Proxy生成代理对象在调用方法是会调用InvactionHander里面Invoke方法
这句注释是重点,测试得出结论就是用Proxy生成的代码无论是什么方法都会调用InvactionHander实现的Invoke方法,因此在调用如方法sayHello时,其实是调用InvactionHander实现Invoke的方法,并不会调用本身sayHello方法,要是我们在Invoke方法中不写对真正原方法的调用,就相当于对类的方法进行了重写,明明看到调用sayHello方法了,此时就会发现sayHello不会起作用了。因此,要实现动态代理必须要在Invoke方法中调用代理对象的真正方法
本文深入解析Java动态代理机制,通过具体实例展示如何使用Proxy类创建代理对象,以及InvocationHandler接口的作用。文章解释了代理对象调用方法时的具体流程,强调了invoke方法在代理过程中的核心地位。
1017

被折叠的 条评论
为什么被折叠?



