package com.proxy.core;
public interface Animal {
public void run();
}
package com.proxy.bean;
import com.proxy.core.Animal;
public class Person implements Animal{
@Override
public void run() {
System.out.println("跑步真他妈爽...");
}
}
package com.proxy.bean;
import com.proxy.core.Animal;
public class Singer implements Animal{
Animal target;
public Singer(Animal target) {
super();
this.target = target;
}
@Override
public void run() {
System.out.println("高歌一曲");
target.run();
System.out.println("唱完");
}
}
package com.proxy.bean;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Singinghandler implements InvocationHandler {
Object target;
public Singinghandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("搞点事情...");
method.invoke(target, args);
System.out.println("事情搞完了...");
return null;
}
}
package com.proxy.client;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.proxy.bean.Person;
import com.proxy.bean.Singer;
import com.proxy.bean.Singinghandler;
import com.proxy.core.Animal;
public class Test {
public static void main(String[] args) {
/*
* 调用原始方法
*/
Animal person=new Person();
person.run();
/*
* 调用代理过的方法
* 虽然实现了代理,但是这种代理只能是被代理也实现了同样的接口才可以的,局限性较大
*/
Animal person2=new Person();
Animal singer=new Singer(person2);
singer.run();
/*
* 动态代理
* 可以代理实现了任意接口的类的方法
*/
Animal person3=new Person();
ClassLoader loader=person3.getClass().getClassLoader();
Class[] interfaces=person3.getClass().getInterfaces();
InvocationHandler h=new Singinghandler(person3);
Animal proxy=(Animal) Proxy.newProxyInstance(loader, interfaces, h);
proxy.run();
}
}