java之动态代理设计模式
时间:2022-07-23
本文章向大家介绍java之动态代理设计模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理:专门完成代理请求的操作类,是所有动态代理类的父类,通过此类为一个或多个接口动态地生成实现类。
弄清动态代理的关键是清楚java的反射机制,在https://www.cnblogs.com/xiximayou/p/12073611.html中已作详细说明。
具体实例:通过动态代理为TestProxy接口生成相应的实现类。
TestProxy.java
package Prox;
public interface TestProxy {
public void test1();
public void test2();
}
TestProxyImpl.java
package Prox;
public class TestProxyImpl implements TestProxy {
@Override
public void test1() {
// TODO Auto-generated method stub
System.out.println("执行test1");
}
@Override
public void test2() {
// TODO Auto-generated method stub
System.out.println("执行test2");
}
}
ProxyDemo.java
package Prox;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//这是动态代理类
public class ProxyDemo implements InvocationHandler{
//被代理的对象
Object obj;
public ProxyDemo(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
//这里指定代理对象的执行方法
System.out.println(method.getName()+"方法开始执行");
Object result = method.invoke(this.obj,args);
System.out.println(method.getName()+"方法结束执行");
return result;
}
}
Test.java
package Prox;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
TestProxy testProxy = new TestProxyImpl();
testProxy.test1();
testProxy.test2();
InvocationHandler handler = new ProxyDemo(testProxy);
//第一个参数是handler.getClass().getClassLoader()类加载器
//第二个参数是被代理对象的接口
//第三个参数是代理的对象
//返回值就是被成功代理后的对象
TestProxy tp = (TestProxy) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
testProxy.getClass().getInterfaces(), handler);
System.out.println("---------------");
tp.test1();
System.out.println("---------------");
tp.test2();
System.out.println("---------------");
}
}
输出:
执行test1 执行test2 --------------- test1方法开始执行 执行test1 test1方法结束执行 --------------- test2方法开始执行 执行test2 test2方法结束执行 ---------------
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- springboot2之优雅处理返回值
- 通过NVM管理Node.js多版本
- 探究 Android 签名机制和原理
- “有迹可循”的灰盒测试分析
- 想用 Gitee 做图床工具,失败了~~
- Nginx系列:配置跳转的常用方式
- Python骚操作:一行代码实现探索性数据分析
- 吊打 Tomcat ,Undertow 性能很炸!!
- 关于在android平台使用nanohttpd实现的http服务在WIFI环境下响应明显太慢的问题
- Vue.js组件库Element中的Select选择器、Cascader级联选择器、Switch开关和Slider滑块
- 年收200万+的Facebook前端工程师(E5)都要求些啥能力?
- 重学数据结构(二、栈)
- 基于深度学习的人员跟踪
- 为了给女朋友独特的七夕惊喜,我学会了人像美肤算法!
- 12种降低开发者工作效率的方法