1.Dog.java
package com.proxy;
public interface Dog {
public void info();
public void run();
}
2.DogImpl.java
package com.proxy;
public class DogImpl implements Dog {
public void info() {
System.out.println("我是一只猎狗");
}
public void run() {
System.out.println("我奔跑迅速");
}
}
3.DogIntercepter.java
package com.proxy;
//定义系统拦截器类,用于拦截Dog实例
public class DogIntercepter {
//第一个拦截器方法
public void method1(){
System.out.println("========模拟通用方法1=========");
}
//第二个拦截器方法
public void method2(){
System.out.println("========模拟通用方法2=========");
}
}
4.MyProxyFactory.java
package com.proxy;
import java.lang.reflect.*;
/*
* 系统还需要一个代理工厂,代理工厂的主要作用是根据目标对象生成一个代理对象,
* 实际上这个代理对象里的方法是目标对象的方法和拦截器方法的组合。。。正是通过些
* 实现拦截
*/
public class MyProxyFactory {
public static Object getProxy(Object object){
//代理处理类
ProxyHandler handler=new ProxyHandler();
//把该Dog实例托付给代理操作
handler.setTarget(object);
//第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
//第二个参数是接口数组,正是代理该接口数组
//第三个参数是代理包含的处理实例。
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);
}
}
5.ProxyHandler.java
package com.proxy;
/*
* 动态调用目标对象的方法
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.*;
public class ProxyHandler implements InvocationHandler {
//需被代理的目标对象
private Object target;
//创建拦截器实例
DogIntercepter di=new DogIntercepter();
//执行代理的目标方法时,该invoke方法会被自动调用
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
//如果被调用的方法是info
if(method.getName().equals("info")){
//调用拦截器方法1
di.method1();
result=method.invoke(target, args);
//调用拦截器方法2
di.method2();
}else{
result=method.invoke(target, args);
}
return result;
}
//用于设置传入目标对象方法
public void setTarget(Object o){
this.target=o;
}
}
6.TestDog.java
package com.proxy;
public class TestDog {
public static void main(String args[]){
Dog targetObject=new DogImpl();
Dog dog=null;
Object proxy=MyProxyFactory.getProxy(targetObject);
if(proxy instanceof Dog){
dog=(Dog)proxy;
}
dog.info();
dog.run();
}
}