java 代理模式[Proxy]--AOP

JDK动态代理出现com.sun.proxy.$Proxy0 cannot be cast to错误 JDK动态代理出现com.sun.proxy.$Proxy0 cannot be cast to错误的原因 阅读详情

一直都想解读一下关于SpringAop源码的部分,但是要解析看懂SpringAop的前置基础是得需要了解Spring运行的大致流程和设计模式的代理模式和Aop的原理思想

那么今天咱们就先来了解一下代理模式和Aop的基本概念吧,后续再来解读SpringAOP的原理吧

一、代理模式

代理类和被代理类实现同一个接口

在使用时通过代理类的对象来调用被代理类的具体方法即可,相当于在被代理类外层又包装了一层

比如:一个Tank(坦克)的实体类 实现了Movable可移动的接口

再创建一个TankProxy坦克代理类,同样去实现Movable可移动的接口

在使用的时候就只通过TankProxy这个类来间接调用Tank类实例化出来的对象相当于是通过TankProxy代理来来代为处理Tank类要做的事情

如图:
在这里插入图片描述
代码如下:

// 创建一个 坦克类,实现可移动的接口
public class Tank implements Movable {
    @Override
    public void move() {
        System.out.println("tank move ....");
    }
}
public class TankProxy implements Movable {
    private Tank tank;
    public TankProxy(Tank tank) {
        this.tank = tank;
    }
    @Override
    public void move() {
        System.out.println("代理类 do something before tank move..");
        tank.move();
        System.out.println("代理类 do something after tank move..");
    }
}
public class ProxyMainTest {
    // 测试
    public static void main(String[] args) {
        TankProxy proxy = new TankProxy(new Tank());
        proxy.move();
    }
}
// 输出结果:
  代理类 do something before tank move..
  tank moving ....
  代理类 do something after tank move..

以上就为简单的一个代理模式,也可称为静态代理

静态代理: 旨在给一个目标类(如:Tank)扩展功能的时候,使用一个代理类(TankProxy)来实现扩展增强的那部分功能,在不改变原先那个被代理类的前提下实现对原有功能的扩展。

代理类在java代码里进行的扩展增强,是在程序运行之前就已经存在的,而动态代理则是在程序运行的过程中创建的代理类

动态代理:

动态代理是程序在运行的过程中去创建代理类,代理类的代码不是现有的,而是在程序运行的过程中动态创建的对应的代理类的字节码文件($Proxy开头的class文件)

动态代理的两种方式有:JDK的动态代理和CGlib方式的动态代理

结合代码如下:

JDK动态代理

动态代理的代理类需要实现java.lang.reflect.InvocationHandler接口,重写invoke() 方法来增强扩展

/**
 * @author xiaolong.ge
 * @since 13 五月 2022
 */
 public class Tank implements Movable {
    @Override
    public void move() {
        System.out.println("tank move ....");
    }
}
public class JdkDynamicTankProxy implements InvocationHandler {
//    Object obj;
    Tank tank;
    public JdkDynamicTankProxy(Tank tank) {
        this.tank = tank;
    }
    /**
     * @param proxy 代理类的对象
     * @param method 被代理类中要执行的方法
     * @param args 方法传入的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        beforeMove();
        // 调用 tank的 move方法
        Object o = method.invoke(tank,args);
        afterMove();
        return o;
    }
    
    public void beforeMove() {
        System.out.println("before tank move");
    }
    public void afterMove() {
        System.out.println("after tank move");
    }
}

public class ProxyMainTest {
    public static void main(String[] args) {
        // 设置 保留创建的代理类的字节码文件 
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        JdkDynamicTankProxy proxyEnhance = new JdkDynamicTankProxy(new Tank());
        // 生成 tank 代理类 $Proxy0 的代理对象 
        // m 就是 $Proxy0 类的实例对象 
        Movable m = (Movable) Proxy.newProxyInstance(Tank.class.getClassLoader(),new Class[]{Movable.class},proxyEnhance);
       
        m.move();  // 此时的 move方法 就是调用的 $Proxy0 类中的 move方法
        // 最终会调用到 JdkDynamicTankProxy的 invoke方法
    }
}
// 执行结果
  before tank move
  tank moving ....
  after tank move

生成的代理类的字节码文件$Proxy0.class
在这里插入图片描述
反编译为java代码如下:

// 生成的代理类的代码 --反编译为java代码如下:
public final class $Proxy0 extends Proxy implements Movable {
    private static Method m1;
    private static Method m3;
    private static Method m2;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }
    public final boolean equals(Object var1) throws  {
        try {
            return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }
    
    public final void move() throws  {
        try {
            // 此处的属性 h ---> 对应的是 JdkDynamicTankProxy的实例 proxy
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }
    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }
    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }
    
    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m3 = Class.forName("com.gexl.designpattern.proxy.Movable").getMethod("move");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

jdk的动态代理模式,被代理的类是必须要实现某个接口 如:Tank 必须要实现Movable接口

而CGLIB实现动态代理,被代理的类则不需要某个接口

CGlib动态代理:Code Generation Library

引入jar包

 <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.3.0</version>
    </dependency>
import net.sf.cglib.proxy.MethodInterceptor;

public class MoveMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before move ...");
        Object result = methodProxy.invokeSuper(o,objects);
        System.out.println("after move ...");
        return result;
    }
}
public class Tank {
     public void move() {
        System.out.println("tank moving ....");
     }
}
--------------------------------------------------------
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @author xiaolong.ge
 * @since 13 五月 2022
 */
public class CGlibTankProxy {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Tank.class);
        enhancer.setCallback(new MoveMethodInterceptor());
        Tank tank = (Tank)enhancer.create();
        tank.move();
    }
}
// 执行结果:
  before move ...
  tank moving ....
  after move ...

CGLib 实现动态代理的原理是,创建一个被代理类的子类来作为代理类,最后调用实现了MethodInterceptor 类的intercept方法来做增强

二、Aop-面向切面编程 Aspect-oriented programming

面向切面编程,即在正常的代码执行流程下,横向织入所需要执行的代码,

如图:
在这里插入图片描述

Aop的织入方式根据代理方式的不同,分为静态织入和动态织入 分别对应的静态代理在源码上织入和动态代理时在生成的代理类织入

织入的点就叫做切入点 PointCut

存放切入代码逻辑的类 就叫做 切面-Aspect (切面类)

Before 或者 After 即切入的时机 则统称为通知Advice

通知还有 After-returning: 在目标方法(被代理的对象的方法)成功执行返回之后调用

After-throwing: 在目标方法抛出异常后调用通知

Around: 包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的代码

执行顺序:
1 : @Around环绕通知
2 : @Before通知执行
3 : @Before通知执行结束
4 : @Around环绕通知执行结束
5 : @After后置通知执行了!
6 : @AfterReturning第一个后置返回通知执行

需要引入 对应的aop 的jar包:aspectjweaver-1.8.9.jar

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.9</version>
</dependency>

代码如下:


import com.gexl.service.LoadFileService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * @author xiaolong.ge
 * @since 13 五月 2022
 */
public class TestAspect {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(App.class);
        LoadFileService loadFileService = (LoadFileService) ac.getBean("loadFileService");
        // 此处获取的 loadFileService 为spring通过cglib 创建的代理对象
        loadFileService.loadFile("D:\\temp\\log");
    }
}
// 执行结果如下:
加载文件方法执行之前。。
加载文件方法。。。
加载文件方法执行之后。。

----------------------------------------------
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * @author xiaolong.ge
 * @since 13 五月 2022
 */
@Aspect
@Component
public class MyAspect {
     // 切面类, 配置前置通知  此时的切入点 就是 LoadFileService.loadFile()方法
    @Before("execution(void com.gexl.service.LoadFileService.loadFile(String))")
    public void beforeLoadFile() {
        System.out.println("加载文件方法执行之前。。");
    }
    @After("execution(void com.gexl.service.LoadFileService.loadFile(..))")
    public void afterLoadFile() {
        System.out.println("加载文件方法执行之后。。");
    }
}
------------------------------------------
@Service
public class LoadFileService {
    public void loadFile(String fileName){
        System.out.println("加载文件方法。。。");
    }
}

需要注意的点:

  1. 需要注意切入的表达式的配置,一定要正确,我就配置错误了,找了一下午才找到问题,execution(方法修饰符 返回类型 方法全限定名(参数))

我在MyAspect.beforeFileLoad() 方法上一开始配置的是void execution(com.gexl.service.LoadFileService.loadFile());

没有给方法配置参数 … 所以导致一直没有匹配到要代理的方法,没有创建代理对象,一直没有调用不到beforeLoadFile() 方法, 就少了两个点

execution(com.gexl.service.LoadFileService.loadFile(…))

2.表达式
execution(public * com.gexl.controller..(…))

* 只能匹配一级路径
.. 可匹配多级,可以是包路径,也可以匹配多个参数
+ 只能放在类后面,表明本类及所有子类

还可以指定开头 如:匹配所有get开头的,第一个参数为Long 类型的方法

@Pointcut(“execution(* …get(Long, …))”)

@annotation(annotationType) 匹配带有指定注解的方法

Java手写实现AOP 什么是AOP? 当然AOP的概念网上一查一大堆,我就不在这贴概念了,大家可以自己看看,在这我就说说自己理解的AOP。 AOP(Aspect Oriented Programming)面向切面编程,即在不影响原有功能的情况下,进行的一次横向扩展。 面向切面和横向扩展我们可以这么理解:有一个分装好的类,我们需要在类的方法执行前后插入额外的代码,要求是不破坏原始类,一种方法是我们可以去继承这个类每个方法前面去增强,但是若是多个方法,每个方法前都去写同样的增强代码不符合我们程序人的身份,所以我们使用AOP的方法,将 阅读详情

相关推荐

pyecharts可视化图表-tree:从入门到精通

本文系统介绍了树图(Tree Chart)的可视化技巧,包含基础实现、方向定制和环形布局等实例。树图能清晰展示层次结构数据,适用于组织架构、文件系统等场景。教程详细解析了pyecharts树图的核心配置项,包括数据准备、方向设置(下上、右左)和样式定制,并提供了完整代码示例。通过本指南,读者可快速掌握专业树图的构建方法,实现复杂层次数据的可视化呈现。

大数据内容个人总结与分享 1970

spring(12)动态代理

代理类 public class ProxyInvocationHandler implements InvocationHandler { private Rent rent; public void setRent(Rent rent) { this.rent = rent; } public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass(

weixin_48591925的博客 439

无线Mesh组网全攻略:从原理、部署到调优与排障

对于布线困难的大户型、复式楼或园区,传统的无线中继往往面临带宽减半和链路不稳定的问题。无线Mesh网络通过多跳转发与自组织路由,让每个节点无需网线即可协作扩展覆盖,并依靠动态路径选择实现自愈。其核心技术涉及802.11s、HWMP路由协议,以及802.11k/v/r协同的无缝漫游,能有效提升终端切换体验。在实际部署中,设备选型、回程频段规划与布点位置直接决定网络质量。围绕无线Mesh的组网原理、设备选型、配置调优与故障排查,提供一套工程实践参考,帮助用户在复杂环境下构建稳定高效的无缝覆盖。

weixin_34098209的博客 273

java动态代理和com.sun.proxy.$Proxy0源码解析

Java动态代理只能针对接口进行动态代理。如果需要对类进行实现代理可以使用:CGLIB,ASM等相关的操作字节码实现(在这里先只介绍下SUN 基于接口动态代理的实现)。 代码如下: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Pr

乐在其中 1万+

如何用ggplot2绘制专业级双侧柱状图展示GO富集结果(附完整代码)

本文详细介绍了如何使用R语言的ggplot2包绘制专业级双侧柱状图展示GO富集结果,包括数据预处理、基础图形构建、高级样式定制和出版级细节调整。通过完整的代码示例和实用技巧,帮助生物信息学研究人员高效可视化高通量数据,提升学术图表的质量和可读性。

weixin_30342209的博客 77

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 240

SpringAOP异常:but was actually of type ‘com.sun.proxy.$Proxy**‘的两种解决方法 2020-09-10

==================================================== 错误描述:Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘’ is expected to be of type '’ but was actually of type 'com.sun.proxy.$Proxy**'的两种解决方法 #这个错误的原因是spring aop代

YangQingLin1219的博客 1453

Uds诊断自动化(CANoe.diva应用)

(7)其他配置选择可以保持默认(一般情况下,DTC以及31服务、下载服务需要另外测试)。(1)打开CANoe.Diva软件,并新建Diva工程。(2)设置工程名和保存位置;在"Specification file"(3)测试案例打开后的界面如下,可以对要进行测试的案例进行勾选,(可查看下角的进度条)后;(3)等待DIva工程的生成;(4)接下来是修改Diva工程选项,如下图点击。,如用例间的时间间隔、复位等待时间等。,即可打开导入的测试工程。,即可生成测试用例。(1)在CANoe中。

LIUJIAAAAA的博客 3444

JDK动态代理

Proxtfactory factory= new ProxtFactory(new 类名() )proxy代表代理对象 method表示要执行的方法 args表示方法的参数列表。使用代理工厂生成代理类时 代理类的类型为目标类所实现的接口。

Echouer的博客 156

Qt+OpenGL+Cesium三件套:打造高性能3D GIS桌面应用的5个关键点

本文深入探讨了如何利用Qt、OpenGL和Cesium数据规范构建高性能桌面级3D GIS应用。文章聚焦于五个关键点:架构选型、OpenGL渲染优化、3D Tiles数据解析与调度、内存与多线程管理,以及高级特性实现,旨在帮助开发者在C++生态中打造不依赖网络、运算能力更强的重型3D地理信息客户端。

weixin_28197941的博客 381

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

【Java 设计模式 · 结构型 & AOP】代理模式(Proxy Pattern)& Spring AOP 应用

代理模式(Proxy Pattern):给某个对象提供一个代理活占位符,并由代理对象来控制对原对象的访问。AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。

茶色喵的博客 745

【面试系列】软件架构师 高频面试题及详细解答

本文介绍了软件架构师岗位的初级、中级和高级面试题及详细解答,涵盖了系统设计、面向对象设计、分布式系统、云计算技术、性能优化等关键领域。通过这些问题和解答,候选人可以深入理解软件架构师的核心职责和技能要求。此外,文章总结了在面试中需要掌握的常考知识点,包括架构模式、分布式系统管理、安全性、数据管理和DevOps实践。通过掌握这些知识点,软件架构师能够有效设计和指导复杂系统的结构,确保系统的可扩展性、性能和维护性。

在路上的专栏 850

java proxy

java proxy

morning_china的专栏 334

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

AOP快速入门

一、概念 AOP面向切面编程,是函数式编程的延申,是对OOP的补充; 代理模式:拦截增强作用,增强功能; 1、java继承,纵向共性抽取, 2、横向切面AOP织入增强代码方式 二、原理是通过代理机制,代理模式的意思就是用代理对象增强原来的真实对象的功能,如Filter拦截器; 其中,Proxy是java自带的一个类; 三、AOP术语 ...

weixin_30563319的博客 169

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

代理模式 动态代理 AOP

记录一下自己对动态代理和AOP的理解 代理模式是为其他对象提供一个代理来控制这个对象。 http://yangguangfu.iteye.com/blog/815787 这个博客举例讲解得比较清楚,如有不明白的地方可以查阅。 动态代理:借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),我们就可以解决代理模式中代码膨胀的问题,使用了动态代理后,“代理角色”将不

holarula的博客 654

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式-代理模式

java的代理模式是很常见的一种设计模式,记录一下我的理解。 代理模式主要的思想是将委托类(被代理类)和真正使用委托类逻辑的类做一个解耦。 太官方的原理我也说不好,所以还是说说自己的理解好了。 java的代理模式分两种: 静态代理 动态代理 我个人认为,如果要理解这种思想,还是主要要搞懂静态代理,这样才能更好地理解这种模式,而动态代理则是调用java的Proxy这个API对静态代理做的一种更...

wenhonglian的博客 305

设计模式之代理模式(文末赠书)

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

2401_85406281的博客 927

Proxy代理(AOP实现原理)

AOP基于动态代理实现:返回代理对象 java.lang.reflect 包Proxy 类,构造代理类。newProxyInstance()就是创建代理对象的方法。 Proxy.newProxyInstance ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。Interfaces,是要被代理的那些那些接口。In...

weixin_30834019的博客 126

江的福浅谈动态代理模式->反射机制->Spirng的Aop

”同是天涯沦落人,相逢何必曾相识。“ 碰到了很多正在学习Spirng框架时,被动态代理模式打回原形,重新修炼反射机制的难兄难弟。 害,学习就是这么个过程,查缺补漏,劝诸君毋妄自菲薄,同时也得戒骄戒躁。

江的福,安杰喊你敲代码啦!~ 308

Java 编程之代理模式

本文详细解析Java代理模式的实现方式及应用场景。代理模式通过中间对象控制对目标对象的访问,常用于权限控制、功能增强、延迟加载等场景。 文中以购票服务为例,展示了静态代理的时间检查功能,以及动态代理的通用增强处理(如优惠券检查、支付提醒)。代理模式是Spring AOP等框架的核心实现机制,合理运用可有效解耦业务与非业务逻辑。

superfreeman的专栏 1377

23种设计模式——代理模式

代理模式 一、静态代理 需要建立两个类,一个是真是类,一个是代理类。 package com.bjsxt.proxy.staticProxy; public interface Star { void confer(); //签协议 void signContract(); //签合同 void bookTicket();//订票 void sing(); /...

DFT99的博客 239

羊村往事与代理模式

代理模式介绍 代理模式是面向对象中常见的设计模式之一。生活中有很多例子,比如说婚介所或者是房屋中介,就是代理模式的体现,中介往往作为中间人帮房东处理房子,而不是房东自己动手。 而代理模式又分为动态代理和静态代理。 这里我们就从羊村往事开始说起,仔细说说它与代理模式的关系... 背景介绍 众所周知,沸羊羊作为中国知名TG巨头之一,有一天他想把一束鲜花送给美羊羊,可是他又觉得不好意思,于是他就去叫喜羊羊帮他送花。这样代理关系就形成了,喜羊羊作为沸羊羊的代理,帮助他完成送花这件事。 静态代理简单示例

MENGBAA的博客 1047

Java代理模式及动态代理详解

本文介绍了Java中的代理模式,重点讲解了静态代理和JDK动态代理的实现。代理模式通过代理对象控制对真实对象的访问,实现解耦和功能扩展。静态代理需要手动创建代理类,在接口变化时维护成本高;动态代理则通过Proxy和InvocationHandler在运行时生成代理类,能统一处理方法调用并添加通用逻辑(如日志、权限等)。文中以超市代理厂商销售为例,展示了静态代理的实现方式,并详细演示了基于JDK动态代理的日志功能增强实现,包括动态代理类的生成原理和调用流程。动态代理相比静态代理具有更好的灵活性和可维护性。

72

第4章:Java中代理模式的实现

       书接上文《第3章:JavaSpringAOP概念详解》https://qlygmwcx.blog.csdn.net/article/details/117279470 我们今天先来看看到底是什么样的需求促使代码的升级和演变,从而叙述下一篇博客中关于Spring中AOP如何使用。        首先我们说一下代理模式,代理模式分为两种,一种是静态代理,一种是

XiaoCai 355

代理模式

转自:http://www.iteye.com/topic/517835,仅供学习   代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用. 代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务的.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,具体红酒工厂在那里,客户不用关心,...

这样生活 108
上一篇: java冒泡排序
下一篇: Spring Ioc启动流程分析
xiaolong_java
博客等级 码龄12年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值