所谓Dynamic Proxy是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
============
package proxy;
import java.lang.reflect.Method;
public interface Advice {
void filting(Method method);
void afterMethod(Method method);
}
-----
package proxy;
import java.lang.reflect.Method;
public class ProxyAdvice implements Advice{
@Override
public void filting(Method method) {
System.out.println("判断禁止添加的方法在代理的invoke方法中做了!");
System.out.println("方法的名字是:"+ method.getName());
}
@Override
public void afterMethod(Method method) {
System.out.println("方法调用之后的方法");
}
}
============这是视频里的做法吧,应该……
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
public class ProxyFactory {
public ProxyFactory(){
}
public static Collection getProxy(final Collection target){
Class proxyClazz = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
Collection proxy =(Collection) Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
System.out.println("方法调用之前的方法");
// System.out.println("方法的名字是:"+ method.getName());
if(method.getName().equals("add")){
System.out.println("禁止添加!");
return false;
}else{
Object obj = method.invoke(target, args);
// System.out.println("方法调用之后的方法");
return obj;
}
}
}
);
return proxy;
}
}
红色代码的部分就相当于调用了自己定义的advice方法,只不过是写在里面罢了。
如果想写成视频里的那样,就把它分离出来写到蓝色代码的部分就行吧。 |