**概述:** 动态代理就是在程序运行期间,直接通过反射生成一个代理对象,代理对象所属的类是不需要存在的
**动态代理的获取**:jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)生成一个代理对象
参数1:ClassLoader loader 被代理对象的类加载器
参数2:Class<?>[] interfaces 被代理对象的要实现的接口
参数3:InvocationHandler h (接口)执行处理类
返回值: 代理对象
前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方法,帮助我们调用方法
InvocationHandler中的Object invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行
参数1:代理对象(慎用)
参数2:当前执行的方法
参数3:当前执行的方法运行时传递过来的参数
返回值:当前方法执行的返回值
定义一个接口
package com.Proxy.Test_02;
/**
* @description: 接口
* @Date: 2021/10/6 14:46
*/
public interface Happy {
void happy();
}
定义一个被代理对象类
package com.Proxy.Test_02;
/**
* @description: 金莲
* @Date: 2021/10/6 14:47
*/
public class JinLian implements Happy{
@Override
public void happy() {
System.out.println("金莲开始嗨皮了");
}
}
创建一个测试类
package com.Proxy.Test_02;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @description:
* @Date: 2021/10/6 14:49
*/
public class Test {
public static void main(String[] args) {
//创建金莲对象
JinLian jl = new JinLian();
//得到代理对象
//得到金莲的类加载器对象
ClassLoader cl = jl.getClass().getClassLoader();
//得到金莲的所有接口的字节码文件
Class<?>[] in = JinLian.class.getInterfaces();
//返回代理对象
//向下转型,用匿名内部类的方式创建代理
Happy proxy = (Happy) Proxy.newProxyInstance(cl, in, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理约两人到房间里");
method.invoke(jl,args);
System.out.println("代理善后");
return null;
}
});
System.out.println(1);
proxy.happy();
System.out.println(2);
}
}
感谢观看,会长期分享学习过程中的一些技术点,喜欢的点点麻烦关注哦