spring 03.动态代理

概述:
  动态代理是指动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),即利用JDK的API生成指定接口的对象,也称之为JDK代理或者接口代理。

动态代理的总结

优点:代理对象无需实现接口,免去了编写很多代理类的烦恼,同时接口增加方法也无需再维护目标对象和代理对象,只需在事件处理器中添加对方法的判断即可。

缺点:代理对象不需要实现接口,但是目标对象一定要实现接口,否则无法使用JDK动态代理。

实现方式:

第一步:增加maven依赖
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.spring03</groupId>
	<artifactId>spring03_dynamic_proxy</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.5.RELEASE</version>
		</dependency>
	</dependencies>
</project>

第二步:编写Rent接口

package org.spring03;

/**
 * 房屋出租接口
 */
public interface Rent {
	void rent();
}

第三步:编写Host
Host.java

package org.spring03;

/**
* 房东类
*/
public class Host implements Rent{
   public void rent() {
   	System.out.println("房主出租房屋!");
   }
}

第四步 编写动态代理类

MyInovationHandler.java

package org.spring03;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 动态代理类 动态的在内存中生成代理类对象
 */
public class MyInovationHandler implements InvocationHandler {
	private Rent rent;
	public void setRent(Rent rent) {
		this.rent = rent;
	}
	/**
	 * 生成代理类 参数一:类加载器、对象即用哪个类加载器来加载这个代理类到 JVM 的方法区(当前的代理器类)
	 * 参数二:接口表明该代理类需要实现的接口(房东类) 参数三:是调用处理器类实例即 ProxyInovationHandler 的实现的实例对象
	 */
	public Object getProxy() {
		return Proxy.newProxyInstance(rent.getClass().getClassLoader(), // 和目标对象的类加载器保持一致
				rent.getClass().getInterfaces(), // 目标对象实现的接口,因为需要根据接口动态生成对象
				this);// InvocationHandler:事件处理器,即对目标对象方法的

	}
	
	/**
	 * proxy 是代理类 method 代理类的调用处理的方法
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("房屋出租开始");
		Object result = method.invoke(rent, args);
		System.out.println("房屋出租结束");
		return result;
	}

}

第五步 编写测试类
Test.java

扫描二维码关注公众号,回复: 4212484 查看本文章

package org.spring03;

public class Test {
	public static void main(String[] args) {
		Host host = new Host();
		MyInovationHandler pih = new MyInovationHandler();
		pih.setRent(host);
		Rent rent = (Rent) pih.getProxy();
		rent.rent();
	}
}

运行结果

房屋出租开始
房主出租房屋!
房屋出租结束


猜你喜欢

转载自blog.csdn.net/shenlanse7626/article/details/84074151