动态代理
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联。

  • java动态代理主要是使用java.lang.reflect包中的两个类。

InvocationHandler类

  • public Object invoke(Object obj,Method method,Object[] obs)
    其中第一个参数 obj 指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。

Proxy类

  • protected Proxy(InvocationHandler h);
  • static Class getProxyClass(ClassLoader loader,Class[] interfaces);
  • static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);

动态代理其实是在运行时生成class
所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,
而且在生成Proxy的时候,必须给他提供一个handler,让他来接管实际的工作。


接口Subject

package com.vince.proxy;/*** Created by vince on 2017/6/13.*/
public interface Subject {public void shopping();
}
package com.vince.proxy;/*** Created by vince on 2017/6/13.*/
public interface Hotel {public void reserve();
}

Person人来实现接口

package com.vince.proxy;/*** Created by vince on 2017/6/13.*/
public class Person implements Subject,Hotel {@Overridepublic void shopping() {System.out.println("付款,买到心仪的比基尼");}@Overridepublic void reserve() {System.out.println("付预定款,打飞的前往目的地");}
}

动态代理 不要手动创建代理类
需要写一个 创建代理类的类

  • 代理对象要执行的方法

    • @param proxy 代理类对象
    • @param method 被代理对象的方法
    • @param args 被代理对象方法的参数
package com.vince.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** Created by vince on 2017/6/13.* 用于动态生成一个代理对象*/
public class CreateProxy implements InvocationHandler {private Object target;//被代理的对象//用于创建代理对象的方法public Object create(Object target){this.target = target;Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);return proxy;}/*** 代理对象要执行的方法* @param proxy  代理类对象* @param method 被代理对象的方法* @param args 被代理对象方法的参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("上海外寻找客户需要的产品...");System.out.println("跟客户确认产品");method.invoke(target,args);System.out.println("完成本次海淘");return null;}
}

测试一下

package com.vince.proxy;import org.junit.Test;/*** Created by vince on 2017/6/13.*/
public class TestDemo {@Testpublic void testProxy(){CreateProxy cp = new CreateProxy();//用来创建代理对象的对象Hotel person = new Person();Hotel proxy = (Hotel) cp.create(person);//proxy.shopping();//invokeproxy.reserve();}
}


类加载器原理分析

1、类的加载过程
JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示:

  1. 装载:查找并加载类的二进制数据;
    2)链接:
    验证:确保被加载类的正确性;
    准备:为类的静态变量分配内存,并将其初始化为默认值;
    解析:把类中的符号引用转换为直接引用;
    3)初始化:为类的静态变量赋予正确的初始值;

2、类的初始化,类什么时候才被初始化:

1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName(“com.vince.Dog”))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类

3、类的加载:
指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象。

Java基础之02 动态代理模式172 173 类加载器原理分析相关推荐

  1. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  2. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  3. 【Java基础】基于动态代理优雅高性能的拷贝对象?BeanCopier

    1.场景:微服务层与层之间进行对象的拷贝 微服务里面为了代码层次结构清晰,一般会进行分层,DAO层,Servic层,Controller.不同层使用不同后缀对象来进行数据传递 DAO层一般会使用 DO ...

  4. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

  5. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

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

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

  7. Java内功修炼系列:代理模式及动态代理

    目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...

  8. 关于java动态代理模式

    1. 动态代理 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联. 动态代理主要用到java.lang.reflect包中的两个类,Invocation ...

  9. 秒懂Java代理与动态代理模式

    版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/shusheng0007/article/details/80864854 出自:shusheng007 设计模式 ...

最新文章

  1. 以SIGSEGV为例详解信号处理(与栈回溯)
  2. SCCM 2012 R2---安装SCCM 2012 R2
  3. iOS-响应上下左右滑动手势
  4. HDU-1128 Self Numbers 筛选
  5. Java学习开发入门基础教程系列
  6. 什么是Zero-Copy?
  7. ValueError: No engine for filetype: 'csv'解决与书本7-2代码改写
  8. datax mysql replace_DataX-MySQL(读写)
  9. 用Vue搭建一个应用盒子(二):datetime-picker
  10. php 解析mib文件,Mib库解析
  11. Linux内核(1)--从开机到main函数
  12. 阅文集团副总裁傅徐军:最佳技术架构选型方法论
  13. 使用Python 3.5/3.6监听本机任意窗口中的按键操作
  14. 与神经网络相比,你对P图一无所知
  15. mysql8.0.15安装方法 mysql8安装教程
  16. JavaScript动态生成HTML元素
  17. 网站建设--报刊订阅管理系统(java+html)(课程设计)内置部分代码和截图,资源库中有该资源
  18. IDEA使用技巧之教你一招:隐藏指定文件/文件夹
  19. 目录_网易微专业C++系统工程师
  20. 【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI

热门文章

  1. 搜索引擎蜘蛛抓取网页规则
  2. 实验三 LZW编解码算法实现与分析
  3. 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!
  4. 微星主板黑苹果_在老机器上LGA775平台安装黑苹果MacOS系统 – 玄烨品果
  5. 异常检测与误用检测的简单对比
  6. Linux限制某些用户或IP登录SSH、允许特定IP登录SSH
  7. 通过ICMP协议判断一个IP是否可达
  8. 阿里云OSS从入门到精通
  9. 关于java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup问题的解决方法
  10. 阿维塔科技在重庆联合产权交易所挂牌;福伊特助力杨房沟水电站首台机组成功投运 | 能动...