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

JavaSE8基础 Proxy 对接口进行动态代理 简单示例

时间:2017-10-08 16:49:21      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:sleep   pac   记录   lan   public   override   hand   bsp   结果   

礼悟:
           好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。
           虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚劝且行且珍惜。




    os :windows7 x64
    jdk:jdk-8u131-windows-x64
    ide:Eclipse Oxygen Release (4.7.0)



接口类:

package blog.jizuiku6;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public interface UserDao {
	void play();
	void sleep();
}

 
接口实现类:

package blog.jizuiku6;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class UserDaoImpl implements UserDao {

	@Override
	public void play() {
		// TODO Auto-generated method stub
		System.out.println("play");
		
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("sleep");
	}

}

 

关键的类出现:

package blog.jizuiku6;

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

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class MyInvocationHandler implements InvocationHandler {

	private Object target = null;

	// 取消 无参构造
	private MyInvocationHandler() {
		// TODO Auto-generated constructor stub
	}

	public MyInvocationHandler(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		
		// 准备部分
		System.out.println("正在读档");

		// 这行代码相当于 
		// result = target.method(agrs);
		Object result = method.invoke(target, args);
		
		// 收尾部分
		System.out.println("正在存档");
		
		return result;
	}

}

 

测试类:

package blog.jizuiku6;

import java.lang.reflect.Proxy;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class Demo {
	public static void main(String[] args) {
		UserDao ud = new UserDaoImpl();
		
		MyInvocationHandler handler = new MyInvocationHandler(ud);	
		ClassLoader loader = ud.getClass().getClassLoader();
		Class[] interfaces = ud.getClass().getInterfaces();
		
		// 对接口中的方法
		UserDao proxy = (UserDao) Proxy.newProxyInstance(loader, interfaces, handler);
		 
		// 执行所有的方法时,执行前会有附加操作,执行后也会有附加操作
		// 有的时候 用到代理是: 执行前进行权限校验,执行后进行日志记录
		// 而这个程序,只是进行简单的演示。不具备实用价值
		// 如果要用在工作中的话,有成熟的框架可以使用。但万变不离其宗,万剑也要归宗!Java
		proxy.play();
		proxy.sleep();
		proxy.hashCode();
			
	}
}

 
结果:
技术分享

 

 


Java优秀,值得学习。
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。

JavaSE8基础 Proxy 对接口进行动态代理 简单示例

标签:sleep   pac   记录   lan   public   override   hand   bsp   结果   

原文地址:http://www.cnblogs.com/jizuiku/p/7637637.html

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