JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
教学视频+原代码下载链接地址:
https://download.csdn.net/download/weixin_46411355/87545977
目录
- JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
- `教学视频+原代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87545977](https://download.csdn.net/download/weixin_46411355/87545977)
- 一、动态代理
- 1.1JDK动态代理
- 1.1.1 proxy
- 1.1.2 InvocationHandler
- 1.1.3 创建一个Maven项目
- 1.1.4 导入Spring的相关依赖
- 1.1.5 修改包名为com.bjpowernode.jdk.proxy
- 1.1.6 目标类(被代理类)Fangdong
- 1.1.7 接口
- 1.1.8 测试类App
- 1.1.9 测试结果
- 1.1.10 封装自定义的InvocationHandler
- 1.1.11 修改测试类App2
一、动态代理
1.1JDK动态代理
1.1.1 proxy
该类提供了方法创建代理类和代理类的对象的方法
创建一个代理类并返回代理类对象
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader : 类加载器,指定类加载器,是为了精确的定位类
interfaces : 接口Class类,使用JDK的反射,必须要有接口
h :InvocationHandler ,代理的处理器,每个代理类都有一个关联的处理器
1.1.2 InvocationHandler
是每个代理类对应的处理器
Object 方法调用的返回值,可以作为被代理的方法调用的返回值
proxy : 代理类对象
method : 目标类中被代理的方法
args : 目标类中被代理的方法的运行参数
Object invoke(Object proxy,Method method,Object[] args)
1.1.3 创建一个Maven项目
1.1.4 导入Spring的相关依赖
dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.18</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
1.1.5 修改包名为com.bjpowernode.jdk.proxy
1.1.6 目标类(被代理类)Fangdong
package com.bjpowernode.jdk.proxy;//房东 被代理类
public class Fangdong implements Lavel{public void sent(){System.out.println("出租1000");}
}
1.1.7 接口
package com.bjpowernode.jdk.proxy;//租售平台
public interface Lavel {void sent();
}
1.1.8 测试类App
App
package com.bjpowernode.jdk.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class App {public static void main(String[] args) {//创建房东对象Fangdong fangdong = new Fangdong();//创建中介Lavel proxyInstance = (Lavel)Proxy.newProxyInstance(App.class.getClassLoader(), new Class[]{Lavel.class},new InvocationHandler() {//处理器// (在没有修改原来的方法的前提下,对原来的方法进行了增强)@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("");//invoke方法里面第一个参数,要额外收取佣金500传入的是目标对象(代理对象)return method.invoke(fangdong, args);}});proxyInstance.sent();}
}
1.1.9 测试结果
1.1.10 封装自定义的InvocationHandler
.`package com.bjpowernode.jdk.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {private Object obj;public MyInvocationHandler(Object obj){this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("多收500");return method.invoke(obj,args);//对象.方法}
}
`
1.1.11 修改测试类App2
package com.bjpowernode.jdk.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class App2 {public static void main(String[] args) {//创建房东对象Fangdong fangdong = new Fangdong();//创建中介Lavel proxyInstance = (Lavel)Proxy.newProxyInstance(App2.class.getClassLoader(),new Class[]{Lavel.class},new MyInvocationHandler(fangdong));proxyInstance.sent();}
}