博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础之动态代理
阅读量:2746 次
发布时间:2019-05-13

本文共 2205 字,大约阅读时间需要 7 分钟。

动态代理:

        
在程序运行过程中产生的这个对象;

        运行特点:在程序的执行过程中,通过一个类Proxy和接口invacationHandler(处理程序)实现动态代理;

        Proxy类中的方法创建动态代理类对象:

                public static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
        InvocationHandler接口:
                Object invoke(Object proxy,Method method,Object[] args);

                        参数1:loader类加载器 public ClassLoader getClassLoader():返回该类的类加载器;

                        参数2:public Class[] getInterfaces():如果此对象表示一个类,则返回一个数组,它包含了该类所实现的所有接口的对象;

        举例:

                提供一个针对用户操作的接口:

package org.westos_test3;/** * * 针对用户操作的接口 * 		提供了增删改查的方法 * */public interface UserDao {	public abstract void add() ;//增加	public abstract void delete() ;//删除	public abstract void update() ;//修改	public abstract void find() ;//查询}
                实现UserDao接口:
package org.westos_test3;//ssh 老框架public class UserDaoImpl implements UserDao {	@Override	public void add() {		System.out.println("调用了增加功能");	}	@Override	public void delete() {		System.out.println("调用了删除功能");	}	@Override	public void update() {		System.out.println("调用了修改功能");	}	@Override	public void find() {		System.out.println("调用了查询功能");	}}
                代理的类:
package org.westos_test3;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {	//给哪个对象生成代理  (目标对象)	private Object target ;		public MyInvocationHandler(Object target) {		this.target = target ;	}		@Override	//proxy:在其上调用方法的代理实例;	//method:当前底层实现的方法;	//args:参数,传入的是对象的数组;	//返回值类型为:Object;	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {		//实现代理的程序		System.out.println("权限校验");		Object obj = method.invoke(target, args) ;//给target进行代理;		System.out.println("日志记录");		return obj;//返回的就是代理对象	}}
                测试类:
package org.westos_test3;import java.lang.reflect.Proxy;/** * 动态代理的测试类; *  */public class Test {	public static void main(String[] args) {		// 创建UserDao对象		UserDao ud = new UserDaoImpl();		ud.add();		ud.delete();		ud.update();		ud.find();		System.out.println("------------------");		// 针对UserDao对象ud给它生产一个代理对象		// 调用处理程序,接口实现类中产生代理		MyInvocationHandler handler = new MyInvocationHandler(ud);		UserDao ud2 = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),ud.getClass().getInterfaces(),handler);		ud2.add();		ud2.delete();		ud2.update();		ud2.find();	}}

转载地址:http://klzad.baihongyu.com/

你可能感兴趣的文章
Ubuntu16.04上的一些记录
查看>>
图说VS2019的一个必现崩溃(续)
查看>>
是什么让生命闪光
查看>>
Windows平台高级调试与优化
查看>>
格友会讲
查看>>
拍案惊奇——软件调试实战训练营暑期特别班(v2.1)
查看>>
过则勿惮改
查看>>
GPU高级调试与优化
查看>>
AI推理和高级优化训练营
查看>>
万般由,何必读书?
查看>>
循环交换与局部性
查看>>
AI推理和高级优化训练营
查看>>
纳秒时代
查看>>
图说2018
查看>>
LINUX平台高级调试和优化(2019庐山站)
查看>>
在调试器里看LINUX内核态栈溢出
查看>>
跑步机上的精彩人生——Linus大神传奇
查看>>
从猫蛇之战再看内核戏CPU
查看>>
从猫蛇之战三看内核戏CPU
查看>>
在调试器里看QQLive捉迷藏
查看>>