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() {//处理器
// (在没有修改原来的方法的前提下,对原来的方法进行了增强)
@Override
public 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;
}
@Override
public 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();
}
}