`

基于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 {

	@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();
	}
	
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics