首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

基于JDK的一个动态署理

2012-09-06 
基于JDK的一个动态代理注意:JDK只支持接口的动态代理,不支持类的动态代理?先写一个接口,以Dog为例package

基于JDK的一个动态代理
注意: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 {@Overridepublic void info() {// TODO Auto-generated method stubSystem.out.println("这是一只狗");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.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();}}

?

?

热点排行