用的是Proxy.newInstance(ClassLoader loader,Class<?>[ ] interfaces,InvocationHandler h) 返回的是Object,
实际是 interfaces 中的所有接口的一个实现类。我们把这个返回的对象,称为代理对象。
interface Dog {
void info();
void run(int speed);
}
class Gundog implements Dog {
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println("我是一只猎狗");
}
@Override
public void run(int speed) {
// TODO Auto-generated method stub
System.out.println("我奔跑迅速,时速已达:" + speed + "公里/小时");
}
}
//相当于: 通用的拦截器
class DogUtil {
void method1() {
System.out.println("模拟第一个通用方法");
}
void method2() {
System.out.println("模拟通用方法二");
}
}
class MyInHandler implements InvocationHandler {
private Object target;// 需要被代理的对象
public void setTarget(Object tar) {
this.target = tar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
DogUtil du = new DogUtil();
du.method1();//用一个通用方法
Object result = method.invoke(target, args);//被代理的对象的方法
du.method2();//再用一个
return result;
}
}
class MyProxyFactory {
public static Object getProxy(Object target) {
MyInHandler handler = new MyInHandler();
handler.setTarget(target);
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), handler);
}
}
public class DynamicProxyDog {
public static void main(String[] args) {
Dog target = new Gundog();
Dog dog = (Dog) MyProxyFactory.getProxy(target);
System.out.println("1:");
dog.info();
System.out.println("\n2:");
dog.run(100);
/*
* 换一种写法:使用生成的代理对象,反射其方法,并invoke
*/
System.out.println("");
System.out.println("3:");
Method infoM = dog.getClass().getMethod("info", null);
infoM.invoke(dog, null);
System.out.println("\n4:");
Method runM = dog.getClass().getMethod("run", int.class);
runM.invoke(dog, 80);
}
}