package cn.hncu.proxy.util;
public interface IDog {
public void run();
}
package cn.hncu.proxy.util;
public class Dog implements IDog{
private String name;
public Dog(){
this.name="小不點";
}
@Override
public void run() {
System.out.println(name+" 正在跑...");
}
}
package cn.hncu.proxy.util;
public interface IPerson {
public void sayHello();
}
package cn.hncu.proxy.util;
public class Person implements IPerson {
private String name;
public Person(String name){
this.name=name;
}
@Override
public void sayHello() {
System.out.println("my name is "+name);
}
}
動態代理
package cn.hncu.proxy.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtils implements InvocationHandler{
private Object obj=null;
private ProxyUtils(Object obj){
this.obj=obj;
}
//給一個原型對象就返回一個代理對象
public static Object getProxy(Object obj){
Object nObj=Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
obj.getClass().getInterfaces(),
new ProxyUtils(obj));//真正的構造傳參
return nObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("前攔。。。這裏可以添加監聽者模式");
Object obj=method.invoke(proxy, args);
System.out.println("後攔。。。這裏可以添加監聽者模式");
return obj;
}
}
動態代理+監聽者
package cn.hncu.proxy.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtils2 implements InvocationHandler{
private Object obj=null;
public ProxyUtils2(Object obj){
this.obj=obj;
}
//給一個原型對象就返回一個代理對象
public Object getProxy(){
Object nObj=Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
obj.getClass().getInterfaces(),
this);
return nObj;
}
private A a;
public void addXXXListener(A a){
this.a=a;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(a!=null){
a.before();
}
System.out.println("前攔。。。這裏可以添加監聽者模式");
Object nObj=method.invoke(obj, args);
System.out.println("後攔。。。這裏可以添加監聽者模式");
if(a!=null){
a.after();
}
return nObj;
}
}
interface A {
public void before();
public void after();
}
演示
package cn.hncu.proxy.util;
import org.junit.Test;
public class Client {
//實現動態代理
@Test
public void test(){
Person p=new Person("xzm");
IPerson ip=(IPerson) ProxyUtils.getProxy(p);
ip.sayHello();
Dog d=new Dog();
IDog id=(IDog) ProxyUtils.getProxy(d);
id.run();
}
//引入監聽者模式+實現動態代理
@Test
public void test2(){
ProxyUtils2 p=new ProxyUtils2(new Person("xzm"));
IPerson ip=(IPerson) p.getProxy();
p.addXXXListener(new A() {
@Override
public void before() {
System.out.println("你好,幫你設置編碼");
}
@Override
public void after() {
System.out.println("再見,資源收回來");
}
});
ip.sayHello();
}
}