java代理模式的实现方法
package com.sample.sping_ireport.cglib; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Calendar;
import java.util.GregorianCalendar; public class ProxyTest {
public static void main(String[] args) {
InvocationHandler handler = null;//调用代理
AbstractUserDao userDao = new UserDao();//DAO
handler = new DaoLogHandler(userDao);
AbstractUserDao proxy = null;
//动态创建代理对象,用于代理一个AbstarctUserDao类型的真实主题对象
proxy = (AbstractUserDao) Proxy.newProxyInstance(AbstractUserDao.class.getClassLoader(), new Class[]{AbstractUserDao.class}, handler);
proxy.findUserById("张无忌"); System.out.println("------------------------"); AbstractDocumentDao docDAO = new DocumentDao();
handler = new DaoLogHandler(docDAO);
AbstractDocumentDao proxy_new = null;
//动态创建代理对象,用于代理一个AbstractDocumentDAO类型的真实主题对象
proxy_new = (AbstractDocumentDao)Proxy.newProxyInstance(AbstractDocumentDao.class.getClassLoader(), new Class[]{AbstractDocumentDao.class}, handler);
proxy_new.deleteDocumentById("D001"); //调用代理对象的业务方法
}
}
interface AbstractUserDao{
public Boolean findUserById(String userId);
}
interface AbstractDocumentDao{
public Boolean deleteDocumentById(String documentId);
}
class UserDao implements AbstractUserDao{
@Override
public Boolean findUserById(String userId) {
if(userId.equalsIgnoreCase("张无忌")){
System.out.println("查询ID为"+userId+"的信息成功");
return true;
}else{
System.out.println("查询ID为"+userId+"的信息失败");
return false;
}
}
}
class DocumentDao implements AbstractDocumentDao{
@Override
public Boolean deleteDocumentById(String documentId) {
if(documentId.equalsIgnoreCase("D001")){
System.out.println("删除ID为"+documentId+"的文档成功");
return true;
}else{
System.out.println("查询ID为"+documentId+"的文档失败");
return false;
}
}
}
//自定义请求处理类,用于实现代理
class DaoLogHandler implements InvocationHandler{
private Calendar calendar;
private Object object;
//带参和无参构造
public DaoLogHandler(){
}
public DaoLogHandler(Object object){
this.object = object;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
beforeInvoke();
Object result = method.invoke(object, args);
afterInvoke();
return result;
}
//调用之后
private void afterInvoke() {
calendar = new GregorianCalendar();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int millSecond = calendar.get(Calendar.MILLISECOND);
String time = hour + ":" +minute +":" +second +":" +millSecond;
System.out.println("调用结束时间"+time);
}
//在调用之前
public void beforeInvoke() {
calendar = new GregorianCalendar();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int millSecond = calendar.get(Calendar.MILLISECOND);
String time = hour + ":" +minute +":" +second+":" +millSecond;
System.out.println("调用开始时间"+time);
} }
-----------------------------------
代码执行结果:
调用开始时间10:::
查询ID为张无忌的信息成功
调用结束时间10:::
------------------------
调用开始时间10:::
删除ID为D001的文档成功
调用结束时间10:::
java代理模式的实现方法的更多相关文章
- Java代理模式
java代理模式及动态代理类 1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...
- Java代理模式示例程序
Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...
- java 代理模式 总结
1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...
- 浅谈java代理模式
讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- JAVA代理模式与动态代理模式
1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...
- 18 java 代理模式 (转)
静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...
- JAVA 代理模式(Proxy)
1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉 ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
随机推荐
- 【使用python urllib时出现[SSL: CERTIFICATE_VERIFY_FAILED]报错的解决方案】
"首先,这个报错是告诉你,你的证书有问题. 其次,出现这个问题的原因,在于Python本身. 问题原因 Python升级到2.7.9以后,引入了一个新特性. 当使用urllib打开https ...
- vue 一些学习笔记
var, let, const 区别 //-----------------var----------------- var a = []; for(var i= 0; i < 10; i++) ...
- java 数据类型优先级
由低到高:byte,short,char—> int —> long—> float —> double 1. 不能对boolean类型进行类型转换. 2. 不能把对象类型转换 ...
- getter和setter
/* 对象属性是由名字.值和自足特性构成的. 属性值可以用一个或两个方法替代,这两个方法就是getter和setter. 由getter和setter定义的属性称作“存取器属性” */ /* 定义存取 ...
- Etcd Learning Notes
官网:https://etcd.io 官方项目地址:https://github.com/etcd-io/etcd 参考资料: https://www.hi-linux.com/posts/40915 ...
- SpringBoot-自动装载
1,SpringBoot里面有内置的tomcat容器. 2,SpringBoot是基于已有的东西创建的新的东西.核心:(AutoConfiguration)自动装载,Starter,Actuator, ...
- cc攻击怎么防御,如何防止cc攻击?
当我们访问一个网站时,如果网站页面越简单,访问速度越快,页面越漂亮,加载速度就越慢,因为要加载更多东西,服务器压力也会比较大.cc攻击就是利用这种弱点,使用大量代理服务器,对网站进行攻击,消耗网站服务 ...
- CDH搭建大数据集群(5.10.0)
纠结了好久,还是花钱了3个4核8G的阿里云主机,且行且珍惜,想必手动搭建过Hadoop集群的完全分布式.HBase的完全分布式的你(当然包括我,哈哈),一定会抱怨如此多的配置,而此时CDH正是解决我们 ...
- 如何在应用程序中使用ML.NET?
https://www.cnblogs.com/shanyou/p/9190701.html ML.NET以NuGet包的形式提供,可以轻松安装到新的或现有的.NET应用程序中. 该框架采用了用于其他 ...
- Java入门笔记 03-面向对象(下)
介绍:除了前面介绍的关于类.对象的基本语法之外,下面继续介绍Java面向对象的特性. 一. 包装类: 从JDK 1.5以后,Java就提供了自动装箱和自动拆箱操作,即: 自动装箱:将一个基本类型的变量 ...