JDK动态代理详解

首先说一下动态代理和静态代理的区别:

静态代理:是预先写好或由特定工具自动生成的代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理:代理是在程序运行时,运用反射机制动态创建而成的,程序运行之前,代理是不存在的。

Java的静态代理最简单的场景,一个接口,一个实现类,一个代理类就可以搞定,这个代理类持有接口实现类的引用,这样便可以实现委托对象的增强了。

Java的动态代理主要有两种,JDK动态代理和cglib动态代理

其中JDK动态代理,主要利用了接口InvocationHandler,还有Proxy类。

InvocationHandler接口:

public interface InvocationHandler {

public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;

}

参数说明:

Object proxy:指代理对象。

Method method:要调用的方法

Object[] args:方法调用时所需要的参数

Proxy类:

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口的实现类动态地生成代理类,此类提供了如下的操作方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

参数说明:

ClassLoader loader:类加载器

Class<?>[] interfaces:得到全部的接口

InvocationHandler h:得到InvocationHandler接口的子类实例

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 下面看一下我写的一个小例子~

package go.derek;

interface Istudy
{
	public void study(String words);
}

上面的接口定义了一个方法。下面是这个接口的实现类

package go.derek;

class StudyImpl implements Istudy
{
	public void study(String words){
		System.out.println(words);
	}
}

下面看一下代理类的代码

package go.derek;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class StudyProxy implements InvocationHandler
{
	private Object target;
	public Object bind(Object target){
		this.target=target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}

	public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
		System.out.println("start");
		Object obj=method.invoke(target,args);
		System.out.println("rest");
		return obj;
	}

}

下面是测试类的代码

package go.derek;

class ProxyTest
{
	public static void main(String[] args)
	{
		StudyProxy sp=new StudyProxy();
		Istudy derek=(Istudy)sp.bind(new StudyImpl());
		derek.study("I'm derek");
	}
}

下面是输出结果:

start

I‘m derek

rest

我们可以看出,代理类确实给委托类实现了增强,不能忽视的是代理类要持有委托类对象的引用。

时间: 2024-10-07 14:54:53

JDK动态代理详解的相关文章

JDK动态代理、CGLIB动态代理详解

一.JDK动态代理 1.1 接口类 package jdkproxy; /** * @author admin *接口类 */ public interface IBookManage { //添加图书 public void addBook(); } 1.2 接口实现类 package jdkproxy; /** * @author admin *接口实现类 */ public class BookManage implements IBookManage { @Override public

JAVA动态代理详解

1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程序运行时,运用反射机制动态创建代理实例对象.JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理. 相关类与接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象. //

Cglib动态代理详解

查阅了很多资料,这样理解起来好像可以一起呵成,不知道有没有什么地方不对,有的话希望大家指导一下 Cglib动态代理 JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理. 示例 : Jar 包 : cglib-2.2.jar, asm-all-3.1 Helloworld 方法 package com.grey

动态代理详解

1 学习动态代理的目的 动态代理技术都是在框架中使用,例如:Struts1.Struts2.Spring和Hibernate中都使用了动态代理技术.如果你不想自己写个框架,那么你基本上是用上不动态代理技术的.学习动态代理技术的目的是为了更好的理解框架内部的原理,也就是说是为了将来学习框架打基础!动态代理技术有点难度!而且明白了动态代理技术可能一时也想不到他适合在什么情况下使用它.这些东西都会在学习框架时渐渐明白. 2 运行时实现指定的接口 想实现某个接口,你需要写一个类,然后在类名字的后面给出"

java动态代理详解,并用动态代理和注解实现日志记录功能

动态代理的概念 动态代理是程序在运行过程中自动创建一个代理对象来代替被代理的对象去执行相应的操作,例如, 我们有一个已经投入运行的项目中有一个用户DAO类UserDao用来对User对象进行数据库的增删改查操作,但是有一天,要求在对用户的增删改查操作时记录相应的日志,这是怎么办呢?难道我们去直接修改UserDao的源代码,然后在UserDao的每个方法中加入日志记录功能,这显然是不合理的,它违背了java的OCP原则,即对修改关闭对扩张开放.比如改现有的代码如下: 接口类 public inte

Java 动态代理详解

package com.at221; //代理设计模式: interface ClothFactory{ void product(); } class NikeFactory implements ClothFactory{//被代理类: @Override public void product() { System.out.println("Nike服装很可靠"); } } class ProxyFactory implements ClothFactory{//代理类: pri

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

JDK动态代理

一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表