java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件。本文主要练习下动态代理,代码用于备忘。对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了。

  • jdk代理

Java代码下载   

  1. import java.lang.reflect.InvocationHandler;

  2. import java.lang.reflect.Method;

  3. import java.lang.reflect.Proxy;

  4. public class ProxyFactory implements InvocationHandler {

  5. private Object tarjectObject;

  6. public Object creatProxyInstance(Object obj) {

  7. this.tarjectObject = obj;

  8. return Proxy.newProxyInstance(this.tarjectObject.getClass()

  9. .getClassLoader(), this.tarjectObject.getClass()

  10. .getInterfaces(), this);

  11. }

  12. @Override

  13. public Object invoke(Object proxy, Method method, Object[] args)

  14. throws Throwable {

  15. Object result = null;

  16. if (AssessUtils.isAssess()) {

  17. result = method.invoke(this.tarjectObject, args);

  18. }else{

  19. throw new NoAssessException("This server cannot run this service.");

  20. }

  21. return result;

  22. }

  23. }

  • cglib代理

Java代码下载   

  1. import java.lang.reflect.Method;

  2. import org.springframework.cglib.proxy.Enhancer;

  3. import org.springframework.cglib.proxy.MethodInterceptor;

  4. import org.springframework.cglib.proxy.MethodProxy;

  5. public class ProxyCglibFactory implements MethodInterceptor {

  6. private Object tarjectObject;

  7. public Object creatProxyInstance(Object obj) {

  8. this.tarjectObject = obj;

  9. Enhancer enhancer=new Enhancer();

  10. enhancer.setSuperclass(this.tarjectObject.getClass());

  11. enhancer.setCallback(this);

  12. return enhancer.create();

  13. }

  14. @Override

  15. public Object intercept(Object obj, Method method, Object[] args,

  16. MethodProxy arg3) throws Throwable {

  17. Object result = null;

  18. if (AssessUtils.isAssess()) {

  19. result = method.invoke(this.tarjectObject, args);

  20. }else{

  21. throw new NoAssessException("This server cannot run this service.");

  22. }

  23. return result;

  24. }

  25. }

  • Aspect注解

Java代码下载   

  1. import org.aspectj.lang.JoinPoint;

  2. import org.aspectj.lang.ProceedingJoinPoint;

  3. import org.aspectj.lang.annotation.Around;

  4. import org.aspectj.lang.annotation.Aspect;

  5. import org.aspectj.lang.annotation.Before;

  6. import org.aspectj.lang.annotation.Pointcut;

  7. @Aspect

  8. public class AssessInterceptor {

  9. @Pointcut(value="execution (* com..*.*(..))")

  10. private void anyMethod(){};

  11. @Before("anyMethod()")

  12. public void doBefore(JoinPoint joinPoint) throws NoAssessException{

  13. if (!AssessUtils.isAssess()) {

  14. throw new NoAssessException("This server cannot run this service.");

  15. }

  16. }

  17. /**

  18. * Around异常的时候调用

  19. * @param pjp

  20. * @throws Throwable

  21. */

  22. @Around("anyMethod()")

  23. public void invoke(ProceedingJoinPoint pjp) throws Throwable{

  24. pjp.proceed();

  25. }

  26. }

转载于:https://blog.51cto.com/12438673/1884641

java代理机制简单实现相关推荐

  1. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

  2. java同步机制简单介绍

    在java编程里经常听到类似的术语: 这个函数是不是同步的... 本文就简单介绍下什么是同步, java中同步的一些处理方法. 1.同步问题产生的原因 Java中同步问题是伴随这多线程而产生的, 也就 ...

  3. Java回调机制简单讲解

    今天刚好学了一下设计模式中的观察者模式,其中涉及到了回调的相关内容,以前也经常用到回调函数,今天稍微总结一下相关内容. 回调 所谓回调:简单来说就是,A对象调用了自己的方法a,方法a接收的参数是B接口 ...

  4. Java反射机制简单使用

    1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lan ...

  5. 从代理机制到Spring AOP

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  6. 从代理机制到Spring AOP,这篇给你安排的明明白白的

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  7. 老年代的更新机制_如何理解Java GC机制

    Java GC机制 简单来说就干了3件事 确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC 确定哪些内存需要回收 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还&quo ...

  8. 【java代理】动态代理

    java代理机制 Table of Contents 1 引言 2 常见的代理 3 代理模式UML图 4 代理模式实例 5 java动态代理 5.1 java动态代理UML图 6 代理模式与装饰者模式 ...

  9. 【重铸Java根基】理解Java反射机制

    最近带应届新员工,教然后知不足,发现自己把很多基础知识已经还给了大学老师,因此开贴,温故而知新! 从最基础的Java知识开始由浅入深,在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开. 本 ...

最新文章

  1. 【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】
  2. oracle express介绍
  3. DS博客作业06--图
  4. 注册.NET Framework
  5. ffmpeg和SDL学习笔记
  6. linux没有检测到触摸板,linux – 制作没有按钮的触摸板,就像带有按...
  7. python加载机制_Python插件机制实现详解
  8. Mac搭建本地服务器及测试demo
  9. 原来编译通过,现在编译不通过,怎么回事?
  10. webstorm 波浪线_WebStorm 使用
  11. 迅速学tar命令对文件的打包压缩与解压缩
  12. [R] R语言删除字符串中的空值““
  13. 一个出身寒门的状元之死全文【原文】
  14. log4j按日期和文件大小生成日志文件
  15. antv g6多次渲染问题解决
  16. 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件
  17. werkzeug routing RequestRedirect 308 Permanent Redirect None
  18. 谈谈我对NLP文档级关系抽取中Ign_F1指标的理解(Ign_F1与F1的关系)
  19. 电路图:重低音功放电路
  20. 微软surface laptop2系统安装

热门文章

  1. android 自定义指南针,如何在android中制作自定义指南针视图
  2. oracle to_date 大写,oracle账号区分大小写吗2015第一博,Oracle时间段查询,TO_DATE和TO_CHAR使用对比...
  3. git 修改默认分支为main_Git:基本操作
  4. python之路day2_Python之路,day2
  5. mysql 5.5 5.6 备份库_mysql5.5备份数据库里面除系统库外的所有数据库
  6. linux centos7杀进程,centos7 nginx 启动/进程状态/杀掉进程
  7. 列表视图案例3——显示联系人
  8. NOIP 2016(不是游记)
  9. 针对《关于郝培强的《为什么我们招聘的时候绝不要传智播客的学生?》》的看法
  10. 物主代词-mine、yours_33