码迷,mamicode.com
首页 > 编程语言 > 详细

Java动态代理

时间:2015-02-08 23:14:27      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:java   动态代理   proxy   

Java动态代理解析(一)

原理

动态代理简单来说就是当我们想调用某个对象的方法时,通常是通过对象直接调用对象自己的方法,然而有时我们并不能直接拿到给对象,而是只能拿到一个“代理”对象,通过代理对象去代理真实对象,调用真实对象的方法。那么问题来了,为什么不能直接拿到对象?代理对象代理真实对象又有写什么用呢?其实之所以用代理对象去代理(代处理)真实对象,就是想在真实对象调用方法前后做一些处理。java已经实现了动态代理,通过java.lang.reflect.InvocationHandler、java.lang.reflect.Method和java.lang.reflect.Proxy三个类实现。


实现

   要想实现动态代理,就要先定义一个接口,然后定义一个普通对象去实现这个类,接着自定义一个代理处理器实现
InvocationHandler,在里面实现代理。

package com.liujun.dynamicProxy;


/**
 * 一个普通的接口
 * @author asus
 *
 */
public interface StudentI {
	
	public void doing();
	
}

package com.liujun.dynamicProxy;


/**
 * 普通对象的实现类
 * @author asus
 *
 */
public class RealStudent implements StudentI {

	@Override
	public void doing() {
		
		System.out.println("我是一个学生");
		
	}

}

package com.liujun.dynamicProxy;

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


/**
 * 代理调用处理器
 * @author asus
 *
 */
public class ProxyHandler implements InvocationHandler {

	//要代理的真实对象
	private Object realObject;
	
	public ProxyHandler(Object realObject) {
		
		this.realObject=realObject;
		
	}

	@Override
	public Object invoke(Object object, Method method, Object[] arg)
			throws Throwable {
		
		Object result;
		
		//方法调用前
		beforeDoing();
		
		//调用真实对象的方法
		result=method.invoke(this.realObject, arg);//调度方法的结果代表该对象obj的参数arg
		
		//方法调用后
		afterDoing();
		
		
		return result;
		
	}
	
	
	/**
	 * 代理对象方法调用前调用该方法
	 */
	private void beforeDoing(){
		
		System.out.println("beforeDoing()");
		
	}

	/**
	 * 代理对象方法调用后调用该方法
	 */
	private void afterDoing(){
		
		System.out.println("afterDoing()");
		
	}
	
}

package com.liujun.test;

import java.lang.reflect.Proxy;

import com.liujun.dynamicProxy.ProxyHandler;
import com.liujun.dynamicProxy.RealStudent;
import com.liujun.dynamicProxy.StudentI;

public class DynamicProxyTest {

	public static void main(String[] args) {

		//真实对象
		StudentI student=new RealStudent();
		
		//代理处理器
		ProxyHandler proxyHandler=new ProxyHandler(student);
		
		//通过代理处理器生成代理对象
		StudentI proxyStuent=(StudentI) Proxy.newProxyInstance(student.getClass().getClassLoader(), student.getClass().getInterfaces(), proxyHandler);
		
		//代理对象代理调用真实对象的方法
		proxyStuent.doing();
		
	}

}







Java动态代理

标签:java   动态代理   proxy   

原文地址:http://blog.csdn.net/u010739551/article/details/43648723

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!