动态代理

类加载机制与反射

☆樱花仙子☆ 提交于 2020-02-27 02:43:40
1、类的加载、连接和初始化 加载类的时机 第一次使用该类 采用预加载机制加载类 Java虚拟机进程(JVM进程) 同一个JVM里的所有线程、所有变量都处于同一个进程里,都使用该JVM进程的内存区 JVM进程终止时机 程序运行到最后正常结束。 程序运行到使用System.exit()或Runtime.getRuntime().exit()代码处结束程序。 程序执行过程中遇到未捕捉的异常或错误而结束。 程序所在平台强行结束了JVM进程。 两个JVM进程间并不会共享数据 类的加载 加载、连接、初始化(当程序使用某个类时,如果该类还未加载进内存中,执行这三个步骤来对类进行初始化。)(这三个步骤通常连续完成,故统称为类加载、类初始化) 类加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。 开发者可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器,可以从不同来源加载类的二进制数据 从本地文件系统加载class文件 从JAR包加载class文件 通过网络加载class文件 把一个java源文件动态编译,并执行加载 类加载器通常无需等到“首次使用”该类时才加载该类

浅谈代理模式

℡╲_俬逩灬. 提交于 2020-02-26 14:46:35
介绍 代理模式是一种非常好理解的设计面试:当前对象不愿意干的,没法干的东西委托给别的对象来做 用代码描述代理模式 一个程序员接口,他每天写代码 ndb也是一个程序员 静态代理 ndb想请一个程序员大V给自己点赞,已得到人气和money 透明代理(普通代理) ndb想让程序员大v只做ndb的生意 代理类自定义方法 大v看到ndb赚大钱,决定加钱 动态代理 ndb 决定不请大v,而请水军(水军便宜,只要点赞就行) public class Java3y implements Programmer { @Override public void coding() { System.out.println("Java3y最新文章:......给女朋友讲解什么是代理模式......."); } } 动态代理 Java提供一个Proxy类,调用它的newinstance方法可以生成某个对象的地理对象,需要三个参数: 参数一:生成代理对象使用哪个类装载器【一般我们使用的是被代理类的装载器】 参数二:生成哪个对象,通过接口指定【指定要被代理类的接口】 参数三:生成的代理对象的方法里干什么事【实现handler接口,我们想怎么实现就怎么实现】 在编写动态代理之前,要明确几个概念 代理对象拥有目标对象相同的方法【参数二指定了对象的接口,代理对象会实现接口的所有方法】 用户调用代理对象的什么方法

动态AOP-Spring AOP 基于@AspectJ

狂风中的少年 提交于 2020-02-26 14:22:26
XML配置 aspectj-autoproxy 注册自定义命名空间Bean定义解析器 AopNamespaceHandler public class AopNamespaceHandler extends NamespaceHandlerSupport { public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator()); // Only in 2.0 XSD: moved to context namespace as of 2.1 registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());

静态代理、动态代理,以及动态代理的调用说明

自作多情 提交于 2020-02-26 05:34:41
原文作者:弥诺R 原文地址: http://www.minuor.com/1524750034/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 提前说说 项目中涉及到的代码我都会上传到码云(gitee)或者github上,提供给大家下载参考,文中就以最简单的方式说明执行过程。源码的地址在文末哦! 代理模式 代理模式分为静态代理和动态代理两种方式,静态代理是在开发的时候就写好代理的过程,并且代理类要和目标类实现同一个接口。而动态代理是代理类通过实现InvocationHandler接口完成,在运行期间动态的构建代理对象,在动态代理的实现过程中还有另一个更为重要的类Proxy,准确的来说,Proxy负责生成代理对象,而InvocationHandler是根据生成的代理对象执行增强内容和目标方法或类。 静态代理 ####要点: 1、代理类需要和目标类需要实现同一个接口 2、在代理类中会内置目标类对象 ####代码分析 创建一个接口Transformers(变形金刚) public interface Transformers { void trans2man();//变形->人 void trans2car();//变形->车 } Transformers的实现类TransformersImpl,可以理解为擎天柱 擎天柱实现了变形金刚接口,拥有两个功能分别是变形成人

Java动态代理

烂漫一生 提交于 2020-02-26 05:24:35
利用代理能够在执行时创建一个实现了一组给定接口的新类。 这样的功能仅仅有在编译时无法确定须要实现哪个接口时才有必要使用。 对于应用程序设计人员来说,遇到这样的情况的机会非常少。然而,对于系统程序设计人员来说。代理带来的灵活性却十分重要。 如果有一个表示接口的Class对象数组(有可能仅仅包括一个接口)。它的确切类型在编译时无法知道。 如今,想要构造一个实现这些接口的类对象,确实有些难度。如果一个Class对象表示一个实际的类,那么就能够使用newInstance方法或反射找出这个类的构造器。可是,不能实例化一个接口。而且在程序处于执行状态时也无法定义一个新类。 为了解决问题,有些程序将会生成代码。将这些代码放置在一个文件里;调用编译器;然后再载入结果类文件,Bean开发工具箱早期版本号中的BeanBox就是一个样例。 非常自然,这样做的速度会比較慢。而且须要将编译器与程序放在一起。而代理机制则是一种更好的解决方式。代理类可以在执行时创建全新的类。 这种代理类可以实现指定的接口。尤其是。它具有下列方法: 1.指定接口所须要的所有方法 2.Object类中的所有方法,比如 toString、equals等 然而,不能在执行时定义这些方法的新代码。而是要提供一个调用处理器(invocation handler)。 调用处理器是实现了InvocationHandler接口的类对象。

动态AOP自定义标签

≯℡__Kan透↙ 提交于 2020-02-24 16:04:48
前言 之前的文章讲述过自定义注解,如果声明了自定义的注解,那么就一定会在程序的某个地方注册了对应的解析器。我们发现在AopNamespaceHandler中的init函数: public class AopNamespaceHandler extends NamespaceHandlerSupport { /** * Register the {@link BeanDefinitionParser BeanDefinitionParsers} for the * '{@code config}', '{@code spring-configured}', '{@code aspectj-autoproxy}' * and '{@code scoped-proxy}' tags. */ @Override public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());

CGLIB(Code Generation Library)详解

大城市里の小女人 提交于 2020-02-24 08:47:23
文章目录 什么是CGLIB 为什么使用CGLIB CGLIB组成结构 例子 常用的API Enhancer ImmutableBean Bean generator Bean Copier BulkBean BeanMap keyFactory Mixin(混合) String switcher Interface Maker Method delegate MulticastDelegate Constructor delegate Parallel Sorter(并行排序器) FastClass 注意 CGLIB和Java动态代理的区别 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib 为什么使用CGLIB CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道Java中有一个动态代理也是做这个事情的,那我们为什么不直接使用Java动态代理,而要使用CGLIB呢

day53 JavaWeb框架阶段——Spring03(Spring 的 AOP 简介,基于XML的 AOP 开发,基于注解的 AOP 开发)

♀尐吖头ヾ 提交于 2020-02-23 17:58:55
1.Spring 的 AOP 简介 今日源码: 链接: https://pan.baidu.com/s/1bG_85XDHdF1rMcklYouvpQ 提取码:8f9u 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 1.2 AOP 的作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 1.3 AOP 的底层实现 实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。 1.4 AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 1.5 JDK 的动态代理 ①目标类接口 public interface

Spring AOP基础—JDK动态代理

…衆ロ難τιáo~ 提交于 2020-02-22 06:30:10
JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。 首先写一个接口 ForumService.java 及其实现类 ForumServiceImpl.java ,主要包括二个方法,删除主题removeTopic 和 删除 removeForum。代码如下: public class ForumServiceImpl implements ForumService { @SuppressWarnings("static-access") public void removeForum(int forumId) { System.out.println("模拟删除Forum记录:" + forumId); try { Thread.currentThread().sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } @SuppressWarnings("static-access") public void removeTopic(int topicId) { System.out.println("模拟删除Topic记录:" +

java动态代理(JDK和cglib)详解

岁酱吖の 提交于 2020-02-19 03:37:16
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 首先看一下静态代理: 1、Count.java Java代码 package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); } 2、CountImpl.java Java代码 package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author