由于静态代理代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,不方便。
动态代理可以使用InvocationHandler接口,重写invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test implements InvocationHandler {
Subject target;
public Test(Subject target) {
// TODO Auto-generated constructor stub
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("Can I say something?");
return method.invoke(target, args);
}
public static void main(String[] args) {
Subject subject=new SubjectImp();
Subject subjectProxy=(Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),
subject.getClass().getInterfaces(),new Test(subject));
subjectProxy.saySomeing("Yes!");
subjectProxy.stop();
}
}
interface Subject{
void saySomeing(String str);
void stop();
}
class SubjectImp implements Subject{
@Override
public void saySomeing(String str) {
// TODO Auto-generated method stub
System.out.println(str);
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("Stop");
}
}