首先说一下我们什么情况下使用代理?

(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。

(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------

一,静态代理

  1. package org.rcisoft.business.reflectDemo;
  2.  
  3. /**
  4. * @author: wsj
  5. * @date: 2018/10/13
  6. * @time: 18:18
  7. */
  8. //静态代理
  9. //接口
  10. public interface StaticReflect {
  11. void show();
  12. }
  13. //被代理类
  14. class Nike implements StaticReflect{
  15. @Override
  16. public void show() {
  17. System.out.println("nike开始生产衣服...");
  18. }
  19. }
  20. //代理类
  21. class ProxyClass implements StaticReflect{
  22. StaticReflect sr;
  23.  
  24. public ProxyClass(StaticReflect st){
  25. this.sr = st;
  26. }
  27. @Override
  28. public void show() {
  29. System.out.println("代理类开始执行,收代理费$10");
  30. sr.show();
  31. }
  32. }
  33.  
  34. class testStaticReflect{
  35. public static void main(String[] args) {
  36. Nike nick = new Nike();
  37. ProxyClass proxyClass = new ProxyClass(nick);
  38.  
  39. proxyClass.show();
  40. }
  41. }

二,动态代理

  1. package org.rcisoft.business.reflectDemo;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7.  
  8. /**
  9. * @author: wsj
  10. * @date: 2018/10/13
  11. * @time: 18:42
  12. */
  13.  
  14. public interface ProxyTest {
  15.  
  16. }
  17. //反射之动态代理
  18. //接口
  19. interface Subject{
  20. void action();
  21. }
  22. //被代理类
  23. class RealSubject implements Subject{
  24. @Override
  25. public void action() {
  26. System.out.println("动态被代理类开始执行啦!...");
  27. }
  28. }
  29. //代理类
  30. class MyInvocationHandler implements InvocationHandler {
  31. Object obj; //实现了被代理类的对象的说明
  32.  
  33. public Object blind(Object obj) {
  34. this.obj = obj;
  35. return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
  36.  
  37. }
  38.  
  39. @Override
  40. public Object invoke(Object proxy, Method method, Object[] args)
  41. throws InvocationTargetException, IllegalAccessException {
  42. return method.invoke(obj, args);
  43. }
  44. }
  45. class testProxyMethod{
  46. public static void main(String[] args) {
  47. RealSubject realSubject = new RealSubject();
  48. MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
  49. Subject subject = (Subject) myInvocationHandler.blind(realSubject);
  50. realSubject.action();
  51. }
  52. }

java 反射之静态and动态代理的更多相关文章

  1. java反射机制应用之动态代理

    1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被 ...

  2. java静态和动态代理原理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  3. 动态代理:JDK原生动态代理(Java Proxy)和CGLIB动态代理原理+附静态态代理

    本文只是对原文的梳理总结,以及自行理解.自己总结的比较简单,而且不深入,不如直接看原文.不过自己梳理一遍更有助于理解. 详细可参考原文:http://www.cnblogs.com/Carpenter ...

  4. Java反射及注解学习- 反射的使用 - JDK动态代理

    代理模式基本概念:1.代理模式的作用:为其他对象提供一种以控制对方的访问在某种情况下,一个客户不想或者不能直接引用另一个对象,代理可以在客户端和目标对象之间起到中介的作用代理的角色:(1)抽象角色:声 ...

  5. JAVA反射机制--静态加载与动态加载

    Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如pu ...

  6. java 面向对象(四十三):反射(七)反射应用四:动态代理

    1.代理模式的原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.任何对原始对象的调用都要通过代理.代理对象决定是否以及何时将方法调用转到原始对象上. 2.静态代理2.1 举例:实现Ru ...

  7. Java编程的逻辑 (86) - 动态代理

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  9. java开发必学知识:动态代理

    目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 ...

随机推荐

  1. 深入了解Redis【二】对象及数据结构综述

    引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(z ...

  2. 2019HNCPC C Distinct Substrings 后缀自动机

    题意 给定一个长度为n字符串,字符集大小为m(1<=n,m<=1e6),求\(\bigoplus_{c = 1}^{m}\left(h(c) \cdot 3^c \bmod (10^9+7 ...

  3. Redis适配采坑记

    Redis适配采坑记 相对于其他的适配,Redis可以说是非常简单的其中只发现一个坑 问题一: 问题描述: redis认证失败 问题详解: redis连接配置时,本地需要采用password属性,远程 ...

  4. Oracle数据库正则表达式

    正则表达式: 无论是在前端还是后台正则表达式都是一个至关重要的知识点,例如判断一个手机号码输入是否正确,如果使用Java.C或者其他语言进行字符串进行判断,也许写几十行代码都不一定能解决,而且漏洞百出 ...

  5. 10.深入k8s:调度的优先级及抢占机制源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 上一篇我们将了获取node成功的情况,如果是一个优先pod获取nod ...

  6. 数据库漏洞扫描工具scuba

    1.先下载安装scuba 参考地址  https://www.52pojie.cn/thread-702605-1-1.html 百度网盘下载地址: 链接:https://pan.baidu.com/ ...

  7. 第16课 - make的隐式规则(下)

    第16课 - make的隐式规则(下) 1

  8. Vue搭建组件库并发布到 npm

    https://www.jianshu.com/p/72d303449abc

  9. VC 编译 MATLAB 的 mex 文件

    VC 编译 MATLAB 的 mex 文件mex 文件是 MATLAB 调用其他程序设计语言程序或算法的接口.在 Windows 环境中,mex 文件是扩展文件名为 DLL 的动态链接库,可以在 m ...

  10. java的注解学习

    转载自https://www.cnblogs.com/xdp-gacl/p/3622275.html 孤傲苍狼 只为成功找方法,不为失败找借口! Java基础加强总结(一)——注解(Annotatio ...