概述:
动态代理是指动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),即利用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();
}
}
运行结果
房屋出租开始
房主出租房屋!
房屋出租结束