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代理模式的实现方法的更多相关文章

  1. Java代理模式

    java代理模式及动态代理类 1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...

  2. Java代理模式示例程序

    Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...

  3. java 代理模式 总结

    1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...

  4. 浅谈java代理模式

    讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...

  5. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  6. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...

  7. 18 java 代理模式 (转)

    静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...

  8. JAVA 代理模式(Proxy)

    1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉 ...

  9. Java代理模式——静态代理模式

    一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...

随机推荐

  1. centos7的netca命令和netmgr命令、dbca命令等基础知识点

    netca命令: netmgr命令: dbca命令: database assistant  configuration 中的SGA 和PGA SGA:System Global Area是Oracl ...

  2. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  3. 循环select和取赋值

    bootstrap: <!--列表容器--> <div class="panel-body" style="position:relative;&quo ...

  4. C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)

    编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...

  5. selenium Python实现附件上传

    对于web页面的上传功能一般有两类实现方式:一类是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器:另一个类是插件上传,一般基于flash/javascript或者 ...

  6. 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(06)

    在知网看到了江南大学的硕士论文: 双有源层a-IGZO薄膜晶体管的特性仿真 IGZO/IZO双有源层薄膜晶体管特性的模拟研究 发现,我昨天的文章中参数的设置存在重大失误,如下材料定义语句中: mate ...

  7. 【Android】数据存储和访问

    一.SharedPreferences 2.SQLite

  8. 最常用的CountDownLatch, CyclicBarrier你知道多少? (Java工程师必会)

    CountdownLatch,CyclicBarrier是非常常用并发工具类,可以说是Java工程师必会技能了.不但在项目实战中经常涉及,而且在编写压测程序,多线程demo也是必不可少,所以掌握它们的 ...

  9. java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 可能是我们运行的java版本过高导致

    最近给自己写了个 SpringBoot 应用程序 顺便练练手,准备把程序过到 树莓派 上,结果登陆报错

  10. Servlet的基本使用

    1.pom.xml导入包 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax ...