Proxy.newInstance与InvocationHandler的使用示例
2024-09-08 13:00:07
先定义一个接口,根据代理模式的原理,被代理类与代理类都要实现它。
public interface Person {
void eat();
}
再写一个实际执行任务的类(被代理类):
public class RealPerson implements Person {
@Override
public void eat() {
System.out.println("I am eating");
}
}
代理类的写法:写一个InvocationHandler的子类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class PersonProxyHandler implements InvocationHandler {
private Person man; public PersonProxyHandler(Person man) {
this.man = man;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before eating");
Object res = method.invoke(man, args);
System.out.println("after eating");
return res;
} }
按照常规想法,代理类要拥有一个被代理类对象的引用,然后在invoke方法中,method.invoke(man, args); 这一句代码表明对实际对象的调用,其余代码就是AOP增强了。
主类:
import java.lang.reflect.Proxy; public class Solution { public static void main(String[] args) {
RealPerson man = new RealPerson();
PersonProxyHandler realHandler = new PersonProxyHandler(man); Person proxy = (Person) Proxy.newProxyInstance(
Person.class.getClassLoader(),
new Class[]{Person.class},
realHandler);
proxy.eat();
}
}
运行main方法,控制台打印如下:
before invoke
is eating
after invoke
这种代理方式也称为“JDK动态代理”
最新文章
- Js 验证中文字符长度
- 修改订单的收货时间(MySQL)脚本
- 51nod算法马拉松13
- 如何做好一名DBA【转】
- perl 改变对象属性
- android网络编程之HttpUrlConnection的讲解--实现文件断点下载
- 本地Windows环境Dubbo搭建测试
- python笔记19-递归调用
- centos安装MySQL5.7
- 【MySql】启动/停止
- 第一节,初识OpenCV3-图像的读、写、显、格式转化等
- word个人信息的一种处理方式
- zookeeper选举状态介绍 摘自https://cloud.tencent.com/developer/news/303891
- Fastjson和Gson零碎总结
- 基于localStorge开发登录模块的记住密码与自动登录
- 《JavaScript面向对象编程指南》
- [经验]微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
- java编码规范_缩进和注释
- c99柔性数组
- sklearn.metrics.roc_curve使用说明