Java反射和动态代理

Java中的反射与JDK动态代理 目录反射的概述反射的概念反射的前提 反射的概述 反射的概念 Java 反射机制是在 运行状态 中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作 Apple apple = new Ap 阅读详情

1.Class类

Class类是一个用于描述类的类,其实例代表了一个运行中程序的类或对象,可以通过Class类实例来获取一个类的相关信息,比如Field,Method,Constructor等信息。

Class没有公有构造方法,一个Class对象是被JVM自动实例化的。

获取一个Class实例的三种方式:

  1. 类名.class
  2. 类实例.getClass()
  3. Class.forName("类全限定名")
public void getClazz() throws ClassNotFoundException {
	//类名.class	
	Class clazz1 = Person.class;
	//Class.forName("类全限定名")	
	Class clazz2 = Class.forName("org.test.reflect.Person");
	//类实例.getClass()
	Person per = new Person();
	Class clazz3 = per.getClass();
}

newInstance()方法:

如果一个Class对象clazz,clazz可以获取clazz本身所代表的类的方法、属性、注解等,而clazz.newInstance()将会返回真正的对象。看代码:

public class TestNewInstance {
	public static void main(String[] args)
			throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		Class<Person> clazz = (Class<Person>) Class.forName("org.test.reflect.Person");
		Person per = clazz.newInstance();
		System.out.println(per);
	}
}
class Person {
	public String name;
	public int age;
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
        public Person(){
        }
}

上面的代码有两个构造器,而newInstance()调用的是无参构造,如果注释无参构造,运行程序会报错:

所以一个类若声明一个带参的构造器,同时要声明一个无参数的构造器。

反射相关代码:

public class TestReflect {

	// 获取Class实例的三种方式
	public Class getClazz() throws ClassNotFoundException {
		Class clazz1 = Person.class;
		Class clazz2 = Class.forName("org.test.reflect.Person");
		Person per = new Person();
		Class clazz3 = per.getClass();
		return clazz2;
	}

	// Class获取方法
	public void getMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
		Class clazz = getClazz();
		// method对象代表了test方法
		Method method = clazz.getMethod("test");
		Person per = (Person) clazz.newInstance();
		// method.invoke()执行per对象的test()方法
		method.invoke(per);
		// 获取所有方法
		Method[] methods = clazz.getDeclaredMethods();
		System.out.println("获取到了" + methods.length + "个声明方法");
	}

	// Class获取属性
	public void getField() throws ClassNotFoundException {
		Class clazz = getClazz();
		// 获取所有属性
		Field[] fields = clazz.getDeclaredFields();
		System.out.println("获取到了" + fields.length + "个声明的属性");
	}

	// Class获取接口
	public void getInterfaces() throws ClassNotFoundException {
		Class clazz = getClazz();
		// 获取所有接口
		Class[] interfaces = clazz.getInterfaces();
		System.out.println("获取到了" + interfaces.length + "个接口");
	}

	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
		TestReflect tr = new TestReflect();
		tr.getMethod();
		tr.getField();
		tr.getInterfaces();
	}
}

需要特别说明的是Method类中的invoke()方法:

    public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException

Method对象的一个实例就代表了一个方法,method.invoke()是指调用这个方法,传入的参数obj是指定调用方法的对象,args是所需要的参数。

2.ClassLoader

在Class类的Outline中看到了getClassLoader(),在此对ClassLoader类稍作一些总结。

2.1文档整理

ClassLoader是用作加载类(具体来说是class文件,包括一些jar包)的,它的作用是将类名转换为文件名,并通过文件名找到相应的class文件。

对于数组(array)而言,如果存放的元素为原型(int,double,char),数组没有ClassLoader,如果存放的是对象或包装类,数组的ClassLoader为元素的ClassLoader。

上面这一段很重要:ClassLoader使用的是委派模型(delegation model)来加载类和资源,每个ClassLoader的实例都有一个相关的父class locader,当尝试去加载类时,ClassLoader的实例会将加载委派为它的父class locader来执行。JVM内置的class loader为“bootstrap class loader”,并没有父class loader,所以可以知道bootstrap class loader是顶级的,或者说是root class loader。

上面明确声明了,JVM加载class文件(注意不是.java文件)是从定义的环境变量CLASSPATH中加载。

2.2类加载器

Java默认提供的三种类加载器:

  1. BootStrap ClassLoader
  2. ExtClassLoader
  3. AppClassLoader

-BootStrap ClassLoader

BootStrap 意为启动、引导,BootStrap ClassLoader是最顶级的加载器,没有父加载器,负责加载核心类库,诸如rt.jar、resources.jar、charsets.jar等,也就是JRE所在目录的lib文件夹下的内容。

-ExtClassLoader

Extended,扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。

这里额外提一嘴:JRE System Libraray,包括核心类库和扩展类库的所有jar包。

-AppClassLoader

Application,系统类加载器,用于加载应用程序classpath目录下的class文件。Java程序一般都使用AppClassLoader来加载类。


来看Class类中的getClassLoader()方法,可以获取当前class的类加载器。

先看一下这个方法的说明:

如果方法返回null,可能代表的是bootstrap class loader,也就是JVM内置的class loader。看代码:

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		Class<Person> clazz = (Class<Person>) Class.forName("org.test.reflect.Person");
		System.out.println(clazz.getClassLoader());
		//获取父class loader
		System.out.println(clazz.getClassLoader().getParent());
		System.out.println(clazz.getClassLoader().getParent().getParent());
	}

输出结果:

可以看到自定类Person的类加载器是AppClassLoader,AppClassLoader的父加载器是ExtClassLoader,再后面返回null,则可能是bootstrap class loader。

2.3委派模型

Delegation Model,也就是JDK文档中所说的,在ClassLoader的实例自己加载类之前,尝试将加载交给父class loader去执行,这种委派模型,决定了类加载的整个过程是由上到下的,而最终导致的加载顺序是:bootstrap class loader先进行加载,加载不到交给ExtClassLoader,然后是AppClassLoader,最后才是自定义的类加载器。

图示:(图片来源:https://img-blog.youkuaiyun.com/20180805222513969?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ2MzQzMzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

3.动态代理

代理的意思就是只作为一个门面,而实际干活的另有其人。使用动态代理,可以在核心业务执行前后加入自定义的逻辑。

Java动态代理可以分为JDK动态代理,也就java.lang.reflect包提供的代理,还有cglib动态代理。

SpringAOP底层是JDK动态代理,而JDK动态代理是基于接口的。SpringAOP典型的应用是数据库事务管理,在某些情况下会出现@Transaction失效的问题,一个排错点就是看拦截的是否为接口。

-Proxy类

提供了为接口创建代理对象的方法,比如:newProxyInstance(),对于此方法JDK文档明确指出了:To create a proxy for some interface。一定要注意是接口。

每个代理对象都有一个相应的invocation handler,invocation handler实现了InvocationHandler接口,此接口中只有一个invoke()方法,当代理对象调用代理接口方法时,实际是把对方法的执行交给invoke()方法来执行,同时向invoke()方法传递三个参数:代理对象、要执行的方法和方法参数。

JDK文档中的proxy class , proxy interface , proxy instance,再加上newProxyInstance()方法,让我对这些概念感到混乱,理清后还是总结一下:

  • proxy class:代理类,HelloWorldImpl实现了HelloWorld接口,就是一个代理类
  • proxy interface:代理接口,HelloWorld接口就是一个代理接口
  • proxy instance代理实例,代理类的实例

现在再来看newProxyInstance()方法:

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException

方法参数说明:

  • loader:proxy class的classLoader
  • interfaces:proxy class实现的所有interface
  • h:相应的InvocationHandler实例

再看文档方法返回值的说明:

可见返回的是proxy class的proxy instance,返回类型是Object,再使用此方法时,应该将返回结果强转为相应的代理类对象(proxy instance)。另外还提到了class loader,这个class loader是代理类的class loader。

看文档中给出的newProxyInstance()方法示例:(注意Foo是一个接口,接口啊)

-InvocationHandler接口

这是一个很重要的接口,看文档中的说明:

每个代理实例都会有一个相应的invocation handler,创建invocation handler只要实现此接口即可。

只有一个invoke()方法:

public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

-case实例

下面来根据一个实例来对动态代理进行说明:

首先是HelloWorld接口和继承类HelloWorldImpl,这两个并没啥好说的。

HelloWorld.java:

public interface HelloWorld {
	public void say();
}

HelloWorldImpl.java:

public class HelloWorldImpl implements HelloWorld {
	@Override
	public void say() {
		System.out.println("hello world !!");
	}
}

ProxyInstance.java:

public class ProxyInstance {

        //目标对象,也就是被代理的类
	private HelloWorld target;
	
	public ProxyInstance(HelloWorld target) {
		this.target=target;
	}
	
	//生成代理对象,这个对象类型应该是HelloWorld,即接口
	public HelloWorld getProxy(InvocationHandlerInstance handler) {
		return (HelloWorld) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
	}
}

ProxyInstance类用于生成代理对象(proxy instance),按照上面叙述的必须使用接口原则,在getProxy()方法中进行强转,就得到一个HelloWorld(接口)类型的代理对象。

注意:在ProxyInstance类中,传入目标对象target,是因为newProxyInstance()需要用到target相关的classLoader和其实现的interfaces。

InvocationHandlerInstance.java:

public class InvocationHandlerInstance implements InvocationHandler{

	private HelloWorld target;
	public InvocationHandlerInstance(HelloWorld target) {
		this.target =target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("-----say()之前的逻辑------");
                //调用say()方法
		Object obj = method.invoke(target, args);
		System.out.println("-----say()之后的逻辑------");
		return obj;
	}
}

在InvocationHandlerInstance类中传入target对象,是因为method.invoke(target,args)方法其实就是say()方法的调用,但需要指定是哪个对象的say()方法,所以传入target对象。

要保证proxy的target对象和invocation handler的target对象是同一个,因为就像之前所说的,proxy只是一个门面,把任务(也就是target)交给invocation handler来执行,如果二者的target不一致肯定不行,会报异常:UndeclaredThrowableException,从名字看可以知道是定义/叙述不清晰导致的异常。

许多框架底层的实现都使用了动态代理,在框架中可能会经常遇到这个异常。

程序入口:TestDemo.java

public class TestDemo {
	public static void main(String[] args) {
		
		//创建目标对象target
		HelloWorldImpl hw =new HelloWorldImpl();
		
		//拿到一个handler,传入目标对象为hw
		InvocationHandlerInstance handler = new InvocationHandlerInstance(hw);

		//拿到一个代理对象,传入目标对象为hw
    		ProxyInstance proxyInstance = new ProxyInstance(hw);
		HelloWorld proxy = proxyInstance.getProxy(handler);

		//proxy.say()并不是真的调用say()方法,而是把say()方法的调用交给invoke()方法
		proxy.say();
	}
}

在TestDemo中应该注意到,为InvocationHandler和Proxy传入的是相同的target对象,即hw,一定要注意这一点。

在上面的实例中是将Proxy和InvocationHandler分两个类来写,这样逻辑比较清楚。实际可以写在一个类中,这样只要定义一个target,就能将其传入Proxy和InvocationHandler了。

参考博客:

https://www.cnblogs.com/tech-bird/p/3525336.html

https://blog.youkuaiyun.com/u014634338/article/details/81434327

TCMSP数据库+R语言实战:从网页爬虫到中药-靶点网络图的全流程解析 本文详细解析了如何使用R语言从TCMSP数据库抓取中药-靶点数据,并通过数据清洗、网络分析和可视化构建完整的中药作用机制研究流程。涵盖动态网页爬虫、ADME参数筛选、网络图构建及高级可视化技巧,为中医药现代化研究提供实用的生物信息学方法。 阅读详情

相关推荐

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南)

本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。

apple5的专栏 1086

java代理学习

基于接口的动态代理,实际上是在内存中生成了一个对象,该对象实现了指定的目标类对象拥有的接口,所以代理类和目标类对象是兄弟关系。

王举 5373

Windows 11下ROS2 Humble与PyCharm无缝集成实战(避坑指南+完整配置流程)

本文详细介绍了在Windows 11系统下如何实现ROS2 Humble与PyCharm的无缝集成,包括环境准备、ROS2 Humble安装、PyCharm配置以及C++与Qt5混合开发的实战技巧。通过避坑指南和完整配置流程,帮助开发者高效搭建稳定的机器人开发环境,特别适合Windows平台的ROS2开发者。

weixin_28710999的博客 367

java动态代理Proxy.newProxyInstance

动态代理(dynamic proxy) 利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现,spring aop就是此原理。 public static Object n...

徐海兴的专栏 9万+

Wiley:International Journal for Numerical Methods in Biomedical Engineering投稿流程

中间过程省略,这个出版社很人性化,投稿的web UI也很好看。上传word之后,一步步跟着走就行,不用填太多东西。不要最后在最后检查阶段,重新上传word文件,这样会导致,之前针对word的操作全部改变。

Everyday try to become better -Kobe Bryant 2545

机器学习第四个算法ANN(人工神经网络)

我是在14年9月刚读研的时候听到一个说法叫“类人脑算法”很火热,之后搞了很长一段时间相关的蓄水池算法等,但大都没有摸到门路而中途放弃了。现今看来,还是缺少一些知识背景,也不善于在网络上学习,随时间推移,也逐渐明白这是机器学习的一小部分,并且逐渐发展的名称叫做人工神经网络的算法,如果网络层较多,又会有个别名,叫做深度学习。其中个用到的最著名的算法是背向传输算法(backpropagation),而这个

legalhighhigh的博客 1万+

JAVA基础-从代理模式再出发!Proxy.newProxyInstance的秘密

介绍Proxy.newProxyInstance内部原理以及生成的代理类是什么样的。

致橡树 3万+

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

一文看懂Java Proxy类创建代理类实现原理源码深度剖析

一文看懂Java Proxy类创建代理类实现原理源码深度剖析,为什么要传入类加载器,代理类是如何创建出来的

大数据开发、JAVA开发、人工智能AI 2998

【Windows Server 2019】邮件服务器配置与管理——安装及配置Winmail服务器(上)

博文介绍了如何安装邮件服务器 Winmail,如何配置Winmail,包括运行服务器,Winmail管理工具介绍和域名配置。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

2.STM32F407ZGT6 学习笔记-移植 FreeRTOS

1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src 和 port 文件夹 (src用于存放freertos源码,port文件夹存放内存和接口相关的文件) 3. 复制freertos/source文件夹下所有c文件复制到刚刚建立的freertos/src目录下 4. 复制FreeRTOSv9.0.0\FreeRTOS\Source\portablex下的MemMang和RVDS文件夹复制到刚刚建立的port问价夹下 5. 将FreeRTOSv9.0.0\FreeRTOS

Car12 1233

详解JDK动态代理类Proxy.newProxyInstance()

这是一个数组,指定了代理类要实现的接口,通过代理对象调用接口中的方法时,实际上会被转发给 InvocationHandler 的 invoke() 方法处理。方法中使用这些参数,我们可以在代理对象的方法被调用时,实现自定义的逻辑和行为,例如在方法调用前后添加日志、执行额外的操作、拦截方法调用等。method 参数表示当前正在调用的方法,通过它可以获取方法的名称、参数等信息。动态代理是一种在运行时创建代理对象的机制,允许我们在不直接访问原始对象的情况下,通过代理对象来调用原始对象的方法。

豆恭梓的博客 2796

1 硬件工程师笔面试高频知识考点真题及解析——电阻

本文系统介绍了电阻的基础知识、选型要点及各类特殊电阻的应用。主要内容包括:1. 电阻选型需考虑阻值、封装、功率、精度、耐压等参数;2. 高频信号优先选用小封装电阻以减小寄生参数;3. 采样电阻需高精度、低温漂以保证测量准确性;4. 详细解析了上拉/下拉电阻、0欧电阻、磁珠等元件的特性与区别;5. 介绍了压敏电阻、热敏电阻等特殊电阻的工作原理及应用场景;6. 阐述了阻抗匹配的重要性及常见匹配方法。文章为电子工程师提供了全面的电阻选型与应用指南。

XU157303764的博客 2863

Java笔试面试-反射和动态代理

反射   反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法。 反射的使用场景 1.编程工具 IDEA 或 Eclipse 等,在写代码时会有代码(属性或方法名)提示,就是因为使用了反射; 2.很多知名的框架,为了让程序更优雅更简洁,也会使用到反射。 例如,Spring 可以通过配置...

HenryLei的博客 5万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java动态代理和反射

反射:允许你在运行时动态访问类的结构(方法、构造函数、字段等),适合场景包括动态加载类或调用类的方法。动态代理:可以在方法调用时插入自定义逻辑,不修改原始对象的代码,广泛用于 AOP 和框架中拦截方法调用的场景。如果你只需要动态调用类的某个方法,使用反射即可;但如果你要在方法调用前后添加逻辑(比如日志、事务),那么动态代理更加合适。在Java中,代理是一种常见的设计模式,它允许你在不修改原始代码的情况下,通过一个代理对象来控制对目标对象的访问。

weixin_44719499的博客 1523

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java反射与动态代理

反射是 Java 提供的一种强大机制,它允许程序在运行时动态地获取类的信息,包括类的属性、方法、构造函数等,并且可以在运行时创建对象、调用方法、访问和修改属性。通过反射,程序可以在运行时根据需要操作类,而不是在编译时就确定好所有的操作。

dsq_MaDing的博客 947

深度学习工具包 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")

彻底理解Java反射以及动态代理中对反射的应用

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使...

Hopefully Sky的博客 5089

Java反射和动态代理详解和实例

一、反射 JAVA反射机制定义: JAVA反射机制是java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。  反射就是把Java类中的各种成分映射成相应的Java类。 Java反射机制主要提供了以下功能:  1、在运行时判断任意一个对

逍遥飞鹤的专栏 5197

Java反射和动态代理模式

这两天在学习Java基础(苦逼应届生,要补的东西太多了!) 把复习到的点记录一下,以后复习看!觉得有用的同学可以点下收藏哦! Java反射和动态代理模式Java反射机制反射构建对象反射方法动态代理模式JDK动态代理CGLIB总结: Java反射机制 应用广泛:类的全限定名、方法和参数,完成对象的初始化,反射某些方法 反射构建对象 举一个例子: 有一个类: public class ReflectServiceImpl { public void sayHello(String name) { Syst

weixin_43882986的博客 336

Java动态代理和反射的关系和理解

例如,如果一个类在编译时不可用,但是在运行时可以动态加载该类并调用其中的方法,那么通过反射机制就可以轻松地实现这一点。反射机制能够实现解耦的原因在于它可以在运行时动态地获取类、方法和字段的信息,从而避免了在编译时就必须知道这些信息的情况。因此可以说动态代理是依赖于反射而实现的功能,动态代理也可以说是一个代理机制,可以看作是装饰器( Decorator)模式的应用,通过代理可以让调用者与实现者之间。总之,Java反射机制能够在运行时动态地加载和使用类、方法和字段,从而实现解耦并提高程序的灵活性和可扩展性。

weixin_52518596的博客 2214

Java高级特性反射与动态代理模式

动态代理模式,也是Java中常见的一种设计模式,其中动态代理模式,也是用到了反射,所以我们反射和动态代理一起学一学,最后我们分析JDK的Proxy是怎么为我们生成代理类的!最后别忘了一键三连哦

amszlk的博客 4549

java反射和动态代理详解

动态代理 反射

K_天道酬勤 2046

Java 反射机制与动态代理

反射机制

fengbaobaola的博客 1803

Java反射&动态代理

​​ 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;​ 对于任意一个对象,都能够调用它的任意属性和方法;​ 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。​通俗的理解:(掌握)利用反射创建的对象可以无视修饰符调用类里面的内容可以跟配置文件结合起来使用,把要创建的对象信息和方法写在配置文件中。读取到什么类,就创建什么类的对象读取到什么方法,就调用什么方法此时当需求变更的时候不需要修改代码,只要修改配置文件即可。

编程小鹏的博客 1180
上一篇: 多线程(五):线程池
下一篇: 单例模式和工厂模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值