`
jzkangta
  • 浏览: 162205 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java代理之JDK动态代理

    博客分类:
  • JAVA
阅读更多
在Java中,动态代理是指代理类的生成发生在程序运行时期,根据被代理类动态生成代理类的字节码文件(class文件),并且装载到运行环境中,像其他的类一样使用,该字节码文件的生存期随着运行环境的关闭而消失。

首先来一些接口的说明:
InvocationHandler接口
它定义了唯一的方法invoke,该方法的参数为代理对象proxy,截获的方法对象method,和方法调用的参数,返回方法执行的结果。

开发者需要实现该接口,在invoke方法中添加对截获的方法的代理操作,并调用被代理对象的方法。

Proxy类
该类是生成代理类的帮助类,它的几个主要方法如下:

public Static Class getProxyClass (ClassLoader loader, Class[] interfaces):根据指定的类加载器和接口获得一个代理类,其中,loader是类加载器,interfaces是被代理类所拥有的接口。
public Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):根据指定的类加载器、接口以及截获器,返回代理类的一个实例对象。

如下写了一个小例子:
一个空的Bean:
package com.jzkangta.demo.bean;

public class Person {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


一个接口:
package com.jzkangta.demo.dao;

import com.jzkangta.demo.bean.Person;

public interface PersonDao {

	public void savePerson();

	public void updatePerson();

	public void deletePerson();

	public Person findPerson();

}


一个接口的实现:
package com.jzkangta.demo.dao.impl;

import com.jzkangta.demo.bean.Person;
import com.jzkangta.demo.dao.PersonDao;

public class PersonDaoImpl implements PersonDao {

	@Override
	public void deletePerson() {
		// TODO Auto-generated method stub
		System.out.println("删除用户了........");
	}

	@Override
	public Person findPerson() {
		// TODO Auto-generated method stub
		System.out.println("查找用户了........");
		return null;
	}

	@Override
	public void savePerson() {
		// TODO Auto-generated method stub
		System.out.println("添加用户了........");
	}

	@Override
	public void updatePerson() {
		// TODO Auto-generated method stub
		System.out.println("修改用户了........");
	}

}


一个ProxyFactory:
package com.jzkangta.demo.aop;

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

public class ProxyFactory implements InvocationHandler {

	private Object targetObject; // 需要代理的目标对象

	//创建代理对象  也可以用构造方法来做
	public Object createProxyIntance(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass() 
				.getClassLoader(),// 第一个参数为代理目标对象的类装载器
				this.targetObject.getClass().getInterfaces(), // 第二个参数为代理目标对象的所有接口,Proxy会为该目标类实现其下所有的接口
				this); // 第三个参数是当拦截到代理请求的时候,使用哪个来处理代理 一般为代理的类 当前类 该类必须实现implements
						// InvocationHandler接口,然后执行invoke方法
	}

	@Override
	public Object invoke(Object arg0, Method method, Object[] arg2)
			throws Throwable {
		
		testFunction();
		//此处可以加逻辑判断,只有正确才执行method.invoke方法
		Object result = method.invoke(targetObject, arg2);  //这里是指需要调用目标代理对象的最终方法
		return result;
	}
	
	public void testFunction(){
		System.out.println("执行额外的功能方法.........");
	}
}



最后是客户端调用:
package com.jzkangta.demo;

import com.jzkangta.demo.aop.ProxyFactory;
import com.jzkangta.demo.dao.PersonDao;
import com.jzkangta.demo.dao.impl.PersonDaoImpl;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ProxyFactory proxyFactory = new ProxyFactory();
		PersonDao personDao = (PersonDao)proxyFactory.createProxyIntance(new PersonDaoImpl());
		personDao.savePerson();
	}

}


最后总结一下:
分析JDK提供的帮助类Proxy,可以发现,它只支持实现接口方式的代理,不支持继承超类方式的代理,这就意味着,被代理的类必须要有接口,并且需要拦截的方法必须都在接口中进行声明。在本例中,通过截获帮助类Proxy生成的代理类的字节码文件,反编译之后,发现,其类的声明如下:

public final class proxy0 extends Proxy implements Command

其中,proxy0就是动态生成的代理类的名字,在该类的方法中,都会将调用委托到拦截器的invoker方法。

因为JDK提供的动态代理仅支持接口方式的代理,那么如果被代理的类没有实现任何接口,如何处理呢?后续将探讨基于CGLib的动态代理,它同时也支持继承超类的方式的代理。


注:文字部分转自互联网
分享到:
评论

相关推荐

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    JDK动态代理_JDK动态代理

    JDK动态代理的核心API包括`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。 - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入...

    关于jdk动态代理的源码剖析

    ### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...

    浅谈JDK动态代理与CGLIB代理去区别

    首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象,而InvocationHandler接口则定义了处理代理对象调用方法的逻辑。当调用代理对象的...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    java jdk 动态代理演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象能够拦截方法调用并在调用前后执行自定义的行为。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect....

    AOP之JDK动态代理和CGLib动态代理

    JDK动态代理的优点是它完全符合Java语言规范,不需要依赖额外的库,但缺点是只能对实现了接口的类进行代理,无法处理未实现接口的类。 **CGLib动态代理**: CGLib(Code Generation Library)是一个高性能的代码...

    Spring框架中JDK动态代理和cglib动态代理

    JDK 动态代理是 Java 自带的动态代理机制,它只能代理接口,而不能代理类。这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    JDK动态代理和CGLIB代理

    JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象的方法调用的逻辑。当通过Proxy创建...

    java动态代理(JDK和cglib).pdf

    JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

    java动态代理(JDK和cglib)共10页.pdf.z

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB库。 首先,我们来看JDK动态代理。JDK动态代理基于Java的反射机制,它要求被代理的类必须实现一个或多个接口。通过`java.lang.reflect.Proxy`类和`java....

    jdk动态代理技术详解

    InvocationHandler 接口是 JDK 中和动态代理直接相关的主要接口之一。该接口相当于 Proxy 类的 CallBack Interface,定义了一个方法 Object:invoke(Object obj, Method method, Object[] args)。第一个参数 proxy ...

    JDK动态代理源码

    在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在运行时动态地创建一个实现了特定接口的代理对象,以此来拦截并扩展原有对象的行为。动态代理在很多场景下都有应用,比如AOP(面向切面编程)、事件...

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...

    JDK动态代理简单示例

    JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

Global site tag (gtag.js) - Google Analytics