网站首页 > java教程 正文
什么是动态代理
所谓的动态代理,就是能动态地根据你传入的需要被代理对象,生成一个代理对象。当你调用被代理的对象的方法时,会通过反射,执行该代理对象的方法,同时会对该方法进行增强。也就是在该方法执行前或执行后,执行预先设置好的代码。
代码实现
由于动态代理的对象需要一个接口,因此首先需要创建一个接口
interface Hello{
void print();
}
然后定义实现类
class HelloImp implements Hello{
public void print(){
System.out.println("你好呀");
}
}
我们需要定义一个类对被代理对象方法调用前后进行增强处理。这个类需要实现InvocationHandler接口这个类需要重写invoke方法
class InvoImp<T> implements InvocationHandler
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射通过方法名对方法进行调用
method.invoke(proxyobj,args);
System.out.println("代理输出");
return proxy;
}
method.invoke是通过反射执行代理方法。如果代码写在method.invoke前,则会在方法执行前调用;如果放在method.invoke后,则会在方法执行后调用
我们还需要写一个方法,该方法接受被代理对象,然后返回一个代理对象。
public Object bind(T obj){
//绑定被代理的对象
this.proxyobj = obj;
//返回代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
测试运行
//创建被代理对象
HelloImp hello = new HelloImp();
//创建代理对象处理器
InvoImp invoImp = new InvoImp();
//获取代理对象
Hello helloproxy = (Hello) invoImp.bind(hello);
//执行方法
helloproxy.print("你好");
执行结果
可以看到,由于“代理输出”放在method.invoke后,因此,执行完print方法后,才会输出“代理输出”
完整代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class test {
public static void main(String[] args) {
HelloImp hello = new HelloImp();
InvoImp invoImp = new InvoImp();
Hello helloproxy = (Hello) invoImp.bind(hello);
helloproxy.print("你好");
}
}
class InvoImp<T> implements InvocationHandler{
Object proxyobj;
public Object bind(T obj){
//绑定被代理的对象
this.proxyobj = obj;
//返回代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
/**
*
* @param proxy 被代理的对象
* @param method 调用的方法
* @param args 方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射通过方法名对方法进行调用
method.invoke(proxyobj,args);
System.out.println("代理输出");
return proxy;
}
}
class HelloImp implements Hello{
public void print(String content){
System.out.println("你好呀" + content);
}
}
interface Hello{
void print(String content);
}
猜你喜欢
- 2024-10-04 java:jdk动态代理(jdk动态代理实现aop)
- 2024-10-04 Java中代理的理解及其实现方式(1)- 静态代理
- 2024-10-04 Java三种代理模式:静态代理、动态代理和cglib代理
- 2024-10-04 Java 学习笔记--反射与代理机制(静态、动态)
- 2024-10-04 Java的动态代理如何实现?#程序员(java动态代理有什么用)
- 2024-10-04 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-04 Java - 动态代理实现原理以及ASM技术
- 2024-10-04 深入理解Java反射和动态代理(jdk动态代理和反射)
- 2024-10-04 java手把手教你写动态代理和静态代理的实现
- 2024-10-04 Java动态代理简单介绍(java动态代理的两种方式)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)