Java基础之02 动态代理模式172 173 类加载器原理分析
动态代理
所谓动态代理,即通过代理类: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)链接又分为三个步骤,如下图所示:
- 装载:查找并加载类的二进制数据;
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 类加载器原理分析相关推荐
- Java设计模式之JDK动态代理模式
先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...
- 学习Spring必学的Java基础知识(2)----动态代理
Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...
- 【Java基础】基于动态代理优雅高性能的拷贝对象?BeanCopier
1.场景:微服务层与层之间进行对象的拷贝 微服务里面为了代码层次结构清晰,一般会进行分层,DAO层,Servic层,Controller.不同层使用不同后缀对象来进行数据传递 DAO层一般会使用 DO ...
- 【Android架构师java原理详解】二;反射原理及动态代理模式
前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...
- java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)
java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理 基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...
- JAVA代理模式与动态代理模式
1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用. 代理模式给 ...
- Java内功修炼系列:代理模式及动态代理
目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...
- 关于java动态代理模式
1. 动态代理 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联. 动态代理主要用到java.lang.reflect包中的两个类,Invocation ...
- 秒懂Java代理与动态代理模式
版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/shusheng0007/article/details/80864854 出自:shusheng007 设计模式 ...
最新文章
- 以SIGSEGV为例详解信号处理(与栈回溯)
- SCCM 2012 R2---安装SCCM 2012 R2
- iOS-响应上下左右滑动手势
- HDU-1128 Self Numbers 筛选
- Java学习开发入门基础教程系列
- 什么是Zero-Copy?
- ValueError: No engine for filetype: 'csv'解决与书本7-2代码改写
- datax mysql replace_DataX-MySQL(读写)
- 用Vue搭建一个应用盒子(二):datetime-picker
- php 解析mib文件,Mib库解析
- Linux内核(1)--从开机到main函数
- 阅文集团副总裁傅徐军:最佳技术架构选型方法论
- 使用Python 3.5/3.6监听本机任意窗口中的按键操作
- 与神经网络相比,你对P图一无所知
- mysql8.0.15安装方法 mysql8安装教程
- JavaScript动态生成HTML元素
- 网站建设--报刊订阅管理系统(java+html)(课程设计)内置部分代码和截图,资源库中有该资源
- IDEA使用技巧之教你一招:隐藏指定文件/文件夹
- 目录_网易微专业C++系统工程师
- 【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI
热门文章
- 搜索引擎蜘蛛抓取网页规则
- 实验三 LZW编解码算法实现与分析
- 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!
- 微星主板黑苹果_在老机器上LGA775平台安装黑苹果MacOS系统 – 玄烨品果
- 异常检测与误用检测的简单对比
- Linux限制某些用户或IP登录SSH、允许特定IP登录SSH
- 通过ICMP协议判断一个IP是否可达
- 阿里云OSS从入门到精通
- 关于java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup问题的解决方法
- 阿维塔科技在重庆联合产权交易所挂牌;福伊特助力杨房沟水电站首台机组成功投运 | 能动...