基本介绍
思路如下
代码如下
Client
package dynamicagent;
public class Client {
public static void main(String[] args) {
TeacherDao teacherDao = new TeacherDao();
ITeacherDao iTeacherDao = (ITeacherDao) new ProxyFactory(teacherDao).getProxyInstance();
iTeacherDao.teacher();
}
}
ITeacherDao
package dynamicagent;
public interface ITeacherDao {
void teacher();
}
ProxyFactory
package dynamicagent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
private Object targ;
public ProxyFactory(Object targ) {
this.targ = targ;
}
public Object getProxyInstance(){
//被代理对象的类加载器 targ.getClass().getClassLoader()
//被代理对象实现的接口 targ.getClass().getInterfaces()
//执行被代理对象方法时会触发事件处理器 传入被代理对象方法 new InvocationHandler()
return Proxy.newProxyInstance(targ.getClass().getClassLoader(),targ.getClass().getInterfaces(),new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始");
Object returnVal= method.invoke(targ,args);
return returnVal;
}
});
}
}
TeacherDao
package dynamicagent;
public class TeacherDao implements ITeacherDao {
@Override
public void teacher() {
System.out.println("老师讲课了");
}
}
好处就是相较于静态代理接口增加方法只需维护被代理对象,也不用创建多个代理对象类,全部由动态创建。