`
dingchd
  • 浏览: 15026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java动态代理原理简单描述

    博客分类:
  • java
 
阅读更多
java的动态代理使用Proxy.newInstance(classloader,interfaces,invocationHandler)方法

该方法进行以下操作:
用classloader作为Proxy0的定义类加载器在内存中加载一个Proxy0类,并实现interfaces的所有接口,同时将invocationHandler传进去Proxy中
interface Bussiness {
	public void doBussiness();
}


public class BussinessImpl implements Bussiness {
	@Override
	public void doBussiness() {
		System.out.println("i do bussiness");
	}
}


public class BussinessInf implements InvocationHandler {
	private Object obj;

	public BussinessInf(Object obj) {
		this.obj = obj;
	}

	@Override
	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {
		System.out.println(proxy.getClass().getName());
		System.out.println("do something before bussiness");

		return m.invoke(obj, args);
	}
}


public class TestMain {
	public static void main(String[] args) {
		Bussiness b = new BussinessImpl();
		BussinessInf proxy = new BussinessInf(b);
		
		Bussiness b1 = (Bussiness) 

Proxy.newProxyInstance(b.getClass().getClassLoader()	, b.getClass().getInterfaces(),proxy);
		System.out.println(b1.getClass().getName());
// proxytest.$Proxy0
		b1.doBussiness();
	}
}


也就是说,将接口定义的方法委托给Proxy,Proxy实现了接口所有的方法;
Proxy内部使用InvocationHandler调用所有接口的方法,而该handler就是我们编写的代理实现逻辑

ps:Proxy0类字节码的获取可以修改jdk的classloader的defineclass方法,在加载字节码时临时将byte数组保存到文件中。或者自己实现一个classloader传入Proxy.newInstance方法

另外。springaop中有还有一个实现的方式叫cglib
cglib是通过继承类的形式,动态生成一个子类。

但是继承类的方式不能aop拦截父类中final方法

如果想aop拦截父类的final方法,只能使用类似asm字节码的暴力手段了。
分享到:
评论

相关推荐

    从Java的角度来讲解C#的代理、事件和事件句柄的原理

    所以,本人根据Java的监听器概念实现的观察者模式,重新用C#代码来描述了C#的难点技术--代理、事件、事件句柄--^_^...希望能够给C#的fan们带来帮助。 阅读条件:熟悉C#语言,会使用csc命令。 阅读人员:非常熟悉...

    深入解析Spring AOP源码:从原理到实现,全方位掌握Java AOP编程精髓

    Spring AOP主要基于动态代理模式,它允许开发者在不改变原有代码结构的情况下,增加额外的行为。这主要通过定义“切面(Aspects)”和“通知(Advices)”来实现,其中切面定义了何时以及如何插入额外的行为,而通知...

    java面试题库2021.pdf

    2、 进程的描述与控制 3、 输入输出系统 4、 存储器管理 5、 处理机调度与死锁 八、 算法与数据结构 1、 哈希 2、 树 3、 遍历 4、 链表 5、 数组 6、 排序 7、 堆与栈 8、 队列 9、 高级算法 九、 设计模式 1、 ...

    java基础案例与开发详解案例源码全

    13.2 JavaIO原理332 13.3 流类结构333 13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 13.4.1 FileInputStream和FileOutputStream336 13.4.2 FileReader和FileWriter338 13.5 缓冲流...

    JavaEE技术问题汇总.docx

    wait方法和Sleep方法简单对比描述一下 comparable与comparator的区别 GC垃圾回收机机制? Java序列化与反序列化是什么?如何实现Java序列化与反序列化.序列化和反序列化使用的API 如何实现Java中的一个...

    java 面试题 总结

    EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 21、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖...

    01.Java设计模式之 单例模式.pdf

    项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

    java面试题

    答:jsp前段动态页面,servlet是纯java类 jsp被编译之后会转换为servlet执行 java基本数据类型有哪些?String是不是基本数据类型,他们有何区别? 答:基本数据类型8种:int、short、byte、long、float、double、...

    java源码文件-browscap-java:在BrowsCapCSV源文件之上的快速,高效,内存高效(线程安全)的Java客户端

    描述 该库可用于解析useragent头,以提取有关使用的浏览器,浏览器版本,平台,平台版本和设备类型的信息。 确定客户端是台式机,平板电脑还是移动设备,或者确定客户端是否在Windows或Mac OS上非常有用(仅举几个...

    超级有影响力霸气的Java面试题大全文档

    EJB容器是EJB组件的代理, EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 24、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不...

    高级开发spring面试题和答案.pdf

    SPI 机制(Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制), 很多地方有用到: AOP Spring的AOP的底层实现原理; 为什么jdk动态代理是必须是接口 两种动态代理的区别 AOP实现方式:...

    安卓java读取网页源码-questions:自问自答

    什么是动态代理 在 Java 中 wait、yield 和 seelp 方法的不同 描述下 Java 中的内存分配 什么是多态,实现多态的机制是什么 接口(Interface)与抽象类(Abstract Class)的区别 重写(Override)与重载(Overload)...

    algorithm-study:你好,世界

    :green_apple: :red_apple: :pear: :melon: :avocado: :potato: :roasted_sweet_potato: :kiwi_fruit: ...描述动态代理的几种实现方式,分别说出相应的优缺点。 动态代理与cglib实现的区别。 为什么CGlib

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    飞嘀出行java源码-Java-DesignPattern:Java设计模式

    项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。...

    Xml转Cglib存数据库

    文档描述在我的文档资源里搜《将XML文件转换成对象,然后存到...涉及到的技术主要用:Dom4j技术,Cglib动态代理技术,java反射原理,不是最精简的,相信你看了之后自己也有一定的想法,想把它完成为自己的小工具。

    java8源码-cainiao:自娱自乐

    说明:文件夹以类型为目录,如并发、JVM、设计模式,文件名称尽量描述主题,如HASHMAP源码分析、代理模式分析 Books中存放分布式技术学习和书籍阅读后笔记、总结和一些面试搜集的问题,具体查看Books中ReadMe.md ...

    TCP-IP详解卷1:协议

    4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2...

    SeimiCrawler文档离线版

    设置动态代理 ◾5.2.14.是否开启系统去重 ◾5.2.15.关于自动跳转 ◾5.2.16.异常请求处理 ◾5.2.17.SeimiAgent支持 ◾5.2.17.1.基本配置 ◾5.2.17.1.1.直接运行 ◾5.2.17.1.2.SpringBoot项目 ◾5.2.17.2.使用 ...

    J2EE应用开发详解

    37 3.5 动态代理 39 3.6 反射机制在Hibernate中的应用 42 3.7 小结 46 第4章 Servlet技术 47 4.1 Servlet简介 47 4.1.1 Servlet的特点 47 4.1.2 Servlet的优势 48 4.1.3 Servlet的工作过程 49 4.1.4 Servlet的生命...

Global site tag (gtag.js) - Google Analytics