java 代理模式实现代码
2024-10-19 14:48:06
1、静态代理
接口类AdminService.java接口
public interface AdminService {
void update();
Object find();
}
实现类AdminServiceImpl.java
public class AdminServiceImpl implements AdminService{
public void update() {
System.out.println("修改管理系统数据");
}
public Object find() {
System.out.println("查看管理系统数据");
return new Object();
}
}
代理类AdminServiceProxy.java
public class AdminServiceProxy implements AdminService {
private AdminService adminService;
public AdminServiceProxy(AdminService adminService) {
this.adminService = adminService;
}
public void update() {
System.out.println("判断用户是否有权限进行update操作");
adminService.update();
System.out.println("记录用户执行update操作的用户信息、更改内容和时间等");
}
public Object find() {
System.out.println("判断用户是否有权限进行find操作");
System.out.println("记录用户执行find操作的用户信息、查看内容和时间等");
return adminService.find();
}
}
测试类Test.java
public class Test {
public static void main(String[] args) {
AdminService adminService = new AdminServiceImpl();
AdminServiceProxy proxy = new AdminServiceProxy(adminService);
proxy.update();
System.out.println("=============================");
proxy.find();
}
}
2、动态代理
接口类
public interface UserManager {
public int get();
}
实现类
public class UserManagerImpl implements UserManager{
@Override
public int get() {
return 0;
}
}
代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
private Object targetObject;
public Object newProxyInstance(Object targetObject){
this.targetObject=targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object ret=null;
try{
/*原对象方法调用前处理日志信息*/
System.out.println("开始-->>");
ret=method.invoke(targetObject, args);
/*原对象方法调用后处理日志信息*/
System.out.println("完毕-->>");
}catch(Exception e){
throw e;
}
return ret;
}
}
测试
public class Test {
public static void main(String[] args) {
// System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
LogHandler logHandler=new LogHandler();
UserManager userManager=(UserManager)logHandler.newProxyInstance(new UserManagerImpl());
System.out.println(userManager.get());
}
}
最新文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
- spring源码分析之cache注解
- jQuery-1.9.1源码分析系列(十) 事件系统——事件包装
- Innodb之表空间转移
- RabbitMQ、Memcache、Redis(队列、缓存)
- Mongodb操作总结
- 自定义控制器的View(loadView)及其注意点
- 黑马程序员_Java泛型
- 201521123051《Java程序设计》第十一周学习总结
- 关于非现场审计软件的一些介绍(ACL、IEDA、Teammate)
- [十四]JavaIO之PrintStream
- go标准库的学习-database/sql
- poj3696 欧拉函数引用
- JDBC封装
- jquery插件导出excel和pdf(解决中文乱码问题)
- 持续集成(1)gitlab的安装
- 查看项目中的laravel的版本
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
- Anaconda+django写出第一个web app(二)
- Gitlab installtation
热门文章
- 3.4 Common Principles 通用原则
- JDBC:(java database Connection) java数据库连接。
- 手把手教你学Dapr - 1. .Net开发者的大时代
- pagelayout在py中的引用不支持size_hint和pos_hint
- 2019OO第四单元作业总结&;OO课程整体总结
- STM32中按键中断分析
- 【做题记录】[NOIP2011 提高组] 观光公交
- AXI总线简介、ID分析、DMA、Vivado烧录、系统集成
- 求1+2+3...+n 牛客网 剑指Offer
- poj 3041 Asteroids(最小点覆盖)