栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

动态代理机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态代理机制

代理机制
  • 概念:用一个类,简介执行另一个类中的方法或引用其成员。

  • 分类:静态代理和动态代理
    动态代理

  • 动态代理的两种基本实现手法:

  • JDK代理机制:使用JDK提供的代理类并且基于接口。

	@SuppressWarnings("unchecked")//不需要检测其类型是否匹配
	public static T getProxy(Object object) {
		
		Classklass = object.getClass();//获取object对象的类
		ClassLoader classLoader = klass.getClassLoader();//类加载器
		Class[] interfaces = klass.getInterfaces();//获得接口
		
		return (T) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
			//InvocationHandler()句柄:实质是接口
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object result = null;
				
				System.out.println("在执行方法" + method + "之前做一件事成为:前置拦截!");
				result = method.invoke(object, args);
				System.out.println("在执行方法" + method + "之后做一件事成为:后置拦截!");
				
				return result;
			}
		});
	}

以上是JDK代理机制的简单实现。

总结:
1.先用一个接口的实现类产生一个对象,然后把这个对象传递到getProxy();中生成一个代理对象。用代理对象来调用接口实现类中的方法。*
2.JDK代理机制在使用时要注意两个问题:
被代理的对象必须是至少一个接口的实现类对象
得到的代理对象,应该是某一接口类型的

  • CGLIB代理机制:不必基于接口,其本质是以被代理对象作为基类,产生的派生类的对象。
    但是,如果被代理对象的类用final修饰,即,这个类本身不允许派生子类,则,这样的类是不能被代理的。
	@SuppressWarnings("unchecked")//不关心返回值类型的一致性问题
	public static  T getProxy(Object object) {
		Class superclass = object.getClass();
		
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(superclass);
		enhancer.setCallback(new InvocationHandler() {
			//setCallback回调函数
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object result = null;
				
				System.out.println("在执行方法" + method + "之前做一件事成为:前置拦截!");
				result = method.invoke(object, args);
				System.out.println("在执行方法" + method + "之后做一件事成为:后置拦截!");
				
				return result;
			}
		});
		
		return (T)enhancer.create();
	}

优点:不依赖于接口。

代理机制完成的功能之一是:能够对已经实现的代码进行“非侵入式”扩展。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340930.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号