`

动态代理-初级篇

阅读更多

最近想总结一下java的动态代理,动态代理有很多种实现方案,下面介绍三种最常用的动态搭理方案:1.jdk自带动态代理2.javassist实现动态代理3.cglib实现动态代理

接口和实现类代码:

package com.java.day1.dynamicproxy.one;

public interface Interface {
	void doSomeThing();
}

 

package com.java.day1.dynamicproxy.one;

public class RealSubject   implements Interface{

	@Override
	public void doSomeThing() {
		System.out.println("do some things..");
	}
}

 jdk自带动态搭理实现

package com.java.day1.dynamicproxy.one;

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

public class JdkProxyHandler  implements InvocationHandler{
	// 这个就是我们要代理的真实对象
    private Object subject;
    //    构造方法,给我们要代理的真实对象赋初值
    public JdkProxyHandler(Object subject) {
        this.subject = subject;
    }
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("do otherthings..jdk..");
		return method.invoke(subject, args);
 	}
}

 

package com.java.day1.dynamicproxy.one;

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

public class JdkTest {

	public static void main(String[] args) {
		//被代理的类
		RealSubject rs = new RealSubject();
		// 代理增强类
		InvocationHandler ih = new JdkProxyHandler(rs);
		// 用java反射生成代理类
		Interface proxy = (Interface) Proxy.newProxyInstance(ih.getClass().getClassLoader(), rs.getClass().getInterfaces(), ih);
		proxy.doSomeThing();
	}

}

 javassist实现动态代理

package com.java.day1.dynamicproxy.one;

import java.lang.reflect.Method;

import javassist.util.proxy.MethodHandler;

public class JavassitInterceptor implements MethodHandler{
	private Object subject;
	public JavassitInterceptor(Object subject){
		this.subject = subject;
	}
	@Override
	public Object invoke(Object self, Method m, Method prosess, Object[] args) throws Throwable {
		System.out.println("do other thing..javassist.");
		return m.invoke(subject, args);
	}

}

 

package com.java.day1.dynamicproxy.one;


import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;

public class javassistTest {

	public static void main(String[] args) throws Exception {
		//被代理的类
		RealSubject rs = new RealSubject();
		// 代理增强类
		JavassitInterceptor ih = new JavassitInterceptor(rs);
		// 用javassist反射生成代理类
	    ProxyFactory pf = new ProxyFactory();
	    pf.setInterfaces(rs.getClass().getInterfaces());
	   Class<?>  proxyClass = pf.createClass();
	   Interface proxy = (Interface) proxyClass.newInstance();
	   ((ProxyObject)proxy).setHandler(ih);
	   proxy.doSomeThing();
 	}

}

 cglib实现动态搭理

package com.java.day1.dynamicproxy.one;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibInterceptor implements MethodInterceptor {
	private Object subject;
	public CglibInterceptor(Object subject){
		this.subject = subject;
	}
	@Override
	public  Object intercept(Object object, Method method, Object[] objects,  MethodProxy methodProxy) throws Throwable  {
		System.out.println("do other things..cglib...");
		return methodProxy.invoke(subject, objects);
	}

}

 

package com.java.day1.dynamicproxy.one;


import net.sf.cglib.proxy.Enhancer;

public class CgligTest {

	public static void main(String[] args) {
		//被代理的类
		RealSubject rs = new RealSubject();
		// 代理增强类
	    Enhancer enhancer = new Enhancer();
	    CglibInterceptor  ci = new CglibInterceptor(rs);
	    enhancer.setCallback(ci);
        enhancer.setInterfaces(rs.getClass().getInterfaces());	    
        Interface proxy = (Interface)enhancer.create();
        proxy.doSomeThing();
	}

}

 我还做了实验,但从创建来看jdk是最快的cglib最慢,但创建好后调用,javassist最快,jdk次之,不过是同一个数量级的,cglib最慢比其他2种慢5倍

2
7
分享到:
评论

相关推荐

    易语言代理IP设置源码.zip

    本篇将围绕“易语言代理IP设置源码”进行深入探讨,帮助读者理解其工作原理并学习如何在实际项目中应用。 首先,代理IP设置源码是网络编程中的一个重要组成部分,它涉及到网络通信和数据传输。在许多网络应用中,如...

    ios-ScrollView嵌套ScrolloView解决方案(初级、进阶).zip

    ### 初级篇:基本嵌套设置 1. **创建ScrollView**:首先,在Storyboard或代码中创建主ScrollView,并设置其frame以覆盖整个视图。确保已将其内容大小(contentSize)设置为大于其实际frame的大小,以便能够滚动。 ...

    银行代理保险工作总结(共5篇) .docx

    【银行代理保险工作总结】 银行代理保险业务是我行中间业务的重要组成部分,它对于拓宽银行业务范围、增加非利息收入具有重要意义。然而,当前我行在这一领域的发展还处于初级阶段,面临诸多挑战和问题。 首先,...

    Linux入门到高级

    - 从初级运维工程师成长为高级运维工程师、运维架构师等。 - 涉足云计算、自动化运维等领域。 - **技能要求**: - 熟悉Linux系统管理。 - 掌握自动化工具,如Ansible、Puppet等。 - 了解DevOps理念和实践。 ###...

    基于WCF构建企业级大型分布式SOA架构(初级篇)

    下载即可获得如下大礼包:企业级大型分布式SOA框架源码 + 模板网站实践项目源码 + 框架工具、资料 + 初级篇全套源码、视频 学.Net WCF——当架构师 轻松就业 前途无限 掌握高端技术、迈进高收入行列 .Net都是谁...

    windows下nginxHTTP服务器入门教程初级篇

    此外,Nginx还提供了一系列的全局变量,例如$host、$server_port、$request_uri、$document_uri、$document_root 和 $request_filename,这些变量可以帮助我们在配置文件中动态地获取当前请求的相关信息。...

    java开发程序指南进阶篇

    通过Class类、Constructor类、Method类和Field类,我们可以动态创建对象、调用方法、修改字段值,甚至实现动态代理。 I/O流是Java处理输入输出的核心工具。Java提供了大量的流类,如FileInputStream和...

    Introduction to Agent Mining

    本篇论文首先介绍了代理挖掘的基本概念、发展历程以及研究背景。 在过去的二十年里,自主代理和多代理系统(AAMAS)以及从数据中发现知识(KDD或称作数据挖掘)这两个领域各自独立发展并取得了显著成就。这些技术的...

    零售市场培训教程——IT篇.ppt

    IT市场,特别是零售领域,是一个复杂而充满竞争的环境,它与传统的农贸市场和小商品市场有许多相似之处,属于初级商业业态。在这个市场中,IT卖场的主办方和产品经营商户分离,主办方主要通过收取租金作为收入来源,...

    spring入门小例子

    本篇文章将通过一个初级入门的小例子,带你深入理解Spring的核心概念,希望对你的学习之路有所帮助。 1. **Spring框架简介** Spring框架是Rod Johnson在2003年创建的,旨在简化企业级Java应用的开发。它提供了一个...

    Java多线程编程实战指南+设计模式篇

    本资源“Java多线程编程实战指南+设计模式篇”深入探讨了这两个主题,旨在帮助开发者提升其在并发编程和软件设计上的技能。 **一、Java多线程** 1. **线程基础**:Java中的线程是程序执行的最小单位。Java通过`...

    Java工程师成神必备宝典.pdf

    该书分为基础篇、底层篇、进阶篇、高级篇、架构篇以及扩展篇六个部分,旨在帮助读者从初级到高级,逐步掌握Java开发的核心技术和实践技巧。 书中详细阐述了Java编程的基础知识,包括面向对象编程的概念和原则。面向...

    某集团战略规划及组织管理模式概述.pptx

    - 行业动态:如初级产品出口竞争加剧,私营企业和科研院所获得进出口业务经营权,茶叶出口政策的调整等,这些都需要公司在战略上作出相应调整。 总结来说,中土畜公司的战略规划涉及了业务的多元化、组织结构的...

    java面试题大全 有中兴华为内部资料, 内容真实,

    这份资料全面覆盖了Java程序员面试的常见知识点,无论是初级开发者还是经验丰富的工程师,都能从中受益。通过深入学习和实践,相信你在Java面试中能展现出扎实的技术功底,顺利进入中兴、华为等顶级企业。

    设计模式的解析和实现(C++)共二十一篇

    本系列共包含二十一篇关于设计模式的解析与实现,旨在帮助中级程序员提升技能,同时为初级开发者提供编程思维的指导。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C++中,可以使用静态成员、...

    C#网页数据采集工具

    本篇将深入探讨如何利用C#进行网页数据采集,以及相关的重要知识点。 首先,C#中的WebClient或HttpClient类是进行网页数据获取的基础。它们允许我们发送HTTP请求,获取响应,从而抓取网页内容。WebClient相对简单,...

    linux运维.pdf

    - **Nginx介绍**:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 - **配置要点**:安装Nginx软件包,配置虚拟主机,优化Nginx性能,理解和配置重写规则。 ##### 5.3 Tomcat/...

    java刺目开发实践

    3. 动态代理:Java Proxy和InvocationHandler可以实现接口的动态代理,常用于AOP(面向切面编程)。 4. 内存模型与垃圾回收:理解JVM内存结构(堆、栈、方法区等)及垃圾回收机制,有助于优化性能和避免内存泄漏。 ...

    APICloud 2016上半年开发工具&开发者服务更新总汇

    - **初级代码篇**:由 APICloud CTO 主讲,适合初级开发者学习 APICloud 开发的基本技巧,让初学者能在短时间内掌握 APICloud 的使用方法。 - **开发工具** - **Sublime 使用教程**:分别提供 Windows 版本和 Mac...

Global site tag (gtag.js) - Google Analytics