动态代理如下图所示
动态代理举例
package com.web.proxy;
public interface Hello {
public void sayHi(String name);
}
package com.web.proxy;
public class HelloImpl implements Hello{
@Override
public void sayHi(String name) {
System.out.println(name+"你好帅啊!!");
}
}
package com.web.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理类
* @author Administrator
*
*/
public class HelloHandler implements InvocationHandler{
//被代理的对象
private Object obj;
//构造方法初始化对象
public HelloHandler(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
before();//为代理的方法添加功能
//调用原始类中的方法
Object o = method.invoke(obj, args);
after();//为代理的方法添加功能
return o;
}
public void before(){
System.out.println("log start...");
}
public void after(){
System.out.println("log end...");
}
}
package com.web.proxy;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
HelloImpl hi = new HelloImpl();
HelloHandler hh = new HelloHandler(hi);
Hello h = (Hello) Proxy.newProxyInstance(hi.getClass().getClassLoader(), hi.getClass().getInterfaces(), hh);
h.sayHi("张三");
}
}
个人理解:首先由接口Hello,方法sayHi,(假设类A),然后HelloImpl实现Hello接口重写sayHi方法(假设类B),然后有Hello的代理类HelloHander实现了InvocationHandler接口(类C),通过构造方法传入对象,重写了invoke方法,此时类C为类B的代理类,那么在Test类中,首先创建了类B的实例,然后在类C的构造方法中传入该类B实例,表示为类B的代理类,再通过Proxy的静态方法newProxyInstance分别传入类B的构造器,类B的接所实现的接口,以及类C的实例,返回一个类A的对象,最终调用的方法便是类B的Invoke中的方法,实现动态代理