`
jiauwu
  • 浏览: 82397 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA代理

阅读更多

通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就像得到真实对象一样,操作这个代理对象时,实际上的功能还是依靠真实对象来完成,只不过是通过代理操作的,即,客户端操作代理,代理操作真正的对象。这样代理就如同一个中转,中转前后可以做很多事,判断权限,判断其它条件等。

代理接口Subject

package com.dev.model.proxy.staticProxy;

/**
 * 静态代理接口
 * @author Hust
 * @Time 2011-11-5
 */
public interface Subject {	
	void doSomeThing();	
}
 

被代理的目标对象RealSubject类 实现Subject接口

package com.dev.model.proxy.staticProxy;

/**
 * 静态代理实现类,被代理的目标对象
 * @author Hust
 * @Time 2011-11-5
 */
public class RealSubject implements Subject {

	/**
	 * 示例方法
	 */
	@Override
	public void doSomeThing() {
		System.out.println(" in " + RealSubject.class);
	}
	
}

实现一:静态代理

   代理对象ProxySubject类

package com.dev.model.proxy.staticProxy;

/**
 * 代理对象
 * @author Hust
 * @Time 2011-11-5
 */
public class ProxySubject implements Subject {

	private Subject real = null; //持有被代理的具体的目标对象
	
	public ProxySubject(Subject sub){//构造方法传入被代理的目标对象
		real = sub;
	}
	
	@Override
	public void doSomeThing() {
		//可以在这里加些权限或者其它数据完整性的判断,如果通过则继续
		before(); //有点像前置通知
		if(null != real)
			real.doSomeThing();
		end(); //有点像后置通知
	}

	public void before(){
		System.out.println("in" +ProxySubject.class+" before() ");
	}
	
	public void end(){
		System.out.println("in" +ProxySubject.class+" end() ");
	}
}
 

测试TestStaticProxy类

package com.dev.model.proxy.staticProxy;

/**
 * 测试 
 * @author Hust
 * @Time 2011-11-5
 */
public class TestStaticProxy {

	public static void main(String[] args) {
		RealSubject rs = new RealSubject();
		ProxySubject ps = new ProxySubject(rs);
		ps.doSomeThing();
		/*** 调用 结果
		 inclass com.dev.model.proxy.staticProxy.ProxySubject before() 
		 in class com.dev.model.proxy.staticProxy.RealSubject
		 inclass com.dev.model.proxy.staticProxy.ProxySubject end()  
		 */
		
	}
	
}

 实现二:JDK动态代理

DynamicProxy类

package com.dev.model.proxy.javaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.dev.model.proxy.staticProxy.RealSubject;
import com.dev.model.proxy.staticProxy.Subject;

/**
 * java动态代理
 * @author Hust
 * @Time 2011-11-6
 */
public class DynamicProxy implements InvocationHandler {

	private Subject sb = null;
	
	public DynamicProxy(Subject sb){
		this.sb = sb;
	}
	
	public Subject getProxyInterface(RealSubject rs){
		//设置被代理对象,方便invoke操作
		this.sb = rs ;
		//将真正的订单对象和动态关联起来
		Subject sub = (Subject)Proxy.newProxyInstance(
				RealSubject.class.getClassLoader(),
				RealSubject.class.getInterfaces(), 
				this);
		return sub;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//if(method.getName().startsWith(""))
		
		return method.invoke(sb, args);
	}

}

 测试:DynamicTest

package com.dev.model.proxy.javaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

import com.dev.model.proxy.staticProxy.RealSubject;
import com.dev.model.proxy.staticProxy.Subject;

/**
 * 测试
 * 代理模式:控制对象访问 
 * @author Hust
 * @Time 2011-11-6
 */
public class DynamicTest {

	public static void main(String[] args) {
		//testProxy1();
		testProxy2();
	}
	
	public static void testProxy2(){
		RealSubject rs = new RealSubject();
		DynamicProxy dp = new DynamicProxy(rs);
		Subject sb = dp.getProxyInterface(rs);
		sb.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject
		
	}
	
	public static void testProxy1(){
		RealSubject rs = new RealSubject();
		InvocationHandler ich = new DynamicProxy(rs);
		Subject sub = (Subject)Proxy.newProxyInstance(ich.getClass().getClassLoader(), rs.getClass().getInterfaces(), ich);
		sub.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject
	}
	
}
 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics