注意:JDK只支持接口的动态代理,不支持类的动态代理
先写一个接口,以Dog为例
package com.lbx.dao;
public interface Dog {
public void info();
public void run();
}
Dog接口的实现
package com.lbx.dao.impl;
import com.lbx.dao.Dog;
public class DogImpl implements Dog {
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println("这是一只狗");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("这只狗在RUN");
}
}
目标代理对象需要在方法前后插入的方法
package com.lbx.interceptor;
public class DogInterceptor {
public void method1(){
System.out.println("第一个拦截方法");
}
public void method2(){
System.out.println("第二个拦截方法");
}
}
关键代码(业务处理)
package com.lbx.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
//需要被代理的目标对象
private Object targer;
//创建拦截器的实例
DogInterceptor di = new DogInterceptor();
//执行代理的目标方法时,此方法自动执行
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(method.getName().equals("info")){
di.method1();
result = method.invoke(targer, args);
di.method2();
}else {
result = method.invoke(targer, args);
}
return result;
}
//用于设置传人目标对象的方法
public void setTarger(Object o){
this.targer = o;
}
}
目标代理对象的工厂
package com.lbx.interceptor;
import java.lang.reflect.Proxy;
import com.lbx.dao.impl.DogImpl;
public class MyProxyFactory {
public static Object getProxy(Object object){
ProxyHandler handler = new ProxyHandler();
handler.setTarger(object);
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),
object.getClass().getInterfaces(), handler);
}
}
测试类
package com.lbx.test;
import com.lbx.dao.Dog;
import com.lbx.dao.impl.DogImpl;
import com.lbx.interceptor.MyProxyFactory;
public class Test {
public static void main(String[] args) {
//先要创建一个需要代理的目标对象
Dog targerObject = new DogImpl();
Dog dog = null;
//创建代理对象
Object proxy = MyProxyFactory.getProxy(targerObject);
if (proxy instanceof Dog) {
dog = (Dog)proxy;
}
dog.info();
dog.run();
}
}