Java - 获取方法的参数名

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现 本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。 阅读详情

普通情况下无法拿到方法的参数名

.java文件属于源码文件,它需要经过了javac编译器编译为.class字节码文件才能被JVM执行的

Java在编译的时候对于方法,默认是不会保留方法参数名,因此如果我们在运行期想从.class字节码里直接拿到方法的参数名是做不到的

public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Test.class.getMethod("test", String.class, Integer.class);
        int parameterCount = method.getParameterCount();
        Parameter[] parameters = method.getParameters();

        System.out.println("方法参数总数:" + parameterCount);
        Arrays.stream(parameters).forEach(p -> System.out.println(p.getType() + "----" + p.getName()));
    }

    public void test(String name, Integer age) {
    }
}

 方法参数总数:2
class java.lang.String----arg0
class java.lang.Integer----arg1


框架中好像能拿到参数名?

按照上面的例子,我们在运行期想从.class字节码里直接拿到方法的参数名是做不到的

但是联想起来在使用Spring MVC的时候,即使不使用注解,只要参数名和请求参数的key对应上了,就能自动完成数值的封装。

而在使用MyBatis(接口模式)时,接口方法向xml里的SQL语句传参时,必须(当然不是100%的必须,特殊情况此处不做考虑)使用@Param(’’)指定key值,在SQL中才可以取到


SpringMVC有什么秘技

public class Main {

    public String testArgName(String name, Integer age) {
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Main.class.getMethod("testArgName", String.class, Integer.class);
        int parameterCount = method.getParameterCount();
        Parameter[] parameters = method.getParameters();
        
        System.out.println("方法参数总数:" + parameterCount);
        Arrays.stream(parameters).forEach(p -> System.out.println(p.getType() + "----" + p.getName()));

        // MethodParameter,DefaultParameterNameDiscoverer,ParameterNameDiscoverer
        // 都是org.springframework.core包下的类
        MethodParameter nameParameter = new MethodParameter(method, 0);
        MethodParameter ageParameter = new MethodParameter(method, 1);
        ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
        nameParameter.initParameterNameDiscovery(parameterNameDiscoverer);
        ageParameter.initParameterNameDiscovery(parameterNameDiscoverer);
        System.out.println(nameParameter.getParameterType() + "----" + nameParameter.getParameterName());
        System.out.println(ageParameter.getParameterType() + "----" + ageParameter.getParameterName());
    }
}

方法参数总数:2
class java.lang.String----arg0
class java.lang.Integer----arg1
class java.lang.String----name
class java.lang.Integer----age 

 Spring MVC借助ParameterNameDiscoverer完成了方法参数名的获取,进而完成数据封装


LineNumberTable

线上程序抛出异常时显示的行号,为啥就恰好就是你源码的那一行呢?有这疑问是因为JVM执行的是.class文件,而该文件的行和.java源文件的行肯定是对应不上的,为何行号却能在.java文件里对应上?

LineNumberTable属性存在于代码的字节码中, 它建立了字节码偏移量到源代码行号之间的联系

javap -verbose xxx.class查看字节码信息

依次执行javac xxx.java 和 javap -verbose xxx.class 查看字节码信息

方法中有个LineNumberTable,可以看到,line行号和源码处完全一样,这就解答了我们上面的行号对应的疑问了:LineNumberTable它记录着在源代码处的行号。

public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Test.class.getMethod("test", String.class, Integer.class);
        int parameterCount = method.getParameterCount();
        Parameter[] parameters = method.getParameters();

        System.out.println("方法参数总数:" + parameterCount);
        Arrays.stream(parameters).forEach(p -> System.out.println(p.getType() + "----" + p.getName()));
    }

    public void test(String name, Integer age) {
    }
}
// 前方省略。。。
public static void main(java.lang.String[]) throws java.lang.NoSuchMethodException;
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
        stack=6, locals=4, args_size=1
        0: ldc           #2                  // class com/example/demo/demos/Test
        2: ldc           #3                  // String test
        // 这块省略。。。
        66: invokeinterface #20,  2           // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V
        71: return
        LineNumberTable:
        line 9: 0
        line 10: 22
        line 11: 27
        line 13: 32
        line 14: 57
        line 15: 71
        Exceptions:
        throws java.lang.NoSuchMethodException

public void test(java.lang.String, java.lang.Integer);
        // 这里省略。。。
        LineNumberTable:
        line 18: 0
        }
// 后方省略


LocalVariableTable

LocalVariableTable属性建立了方法中的局部变量与源代码中的局部变量之间的对应关系。这个属性也是存在于代码的字节码中
从名字可以看出来:它是局部变量的一个集合。描述了局部变量和描述符以及和源代码的对应关系。

依次执行javac xxx.java 和 javap -verbose xxx.class 查看字节码信息

可以看到有LineNumberTable,并没有LocalVariableTable

改成分别使用javac -parameters、javac -g来编译后再执行,运行发现程序中能够获得参数名了,查看字节码:

-parameters:

// 前方省略。。。
public static void main(java.lang.String[]) throws java.lang.NoSuchMethodException;
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
        stack=6, locals=4, args_size=1
        0: ldc           #2                  // class com/example/demo/demos/Test
        2: ldc           #3                  // String test
        // 这块省略。。。
        66: invokeinterface #20,  2           // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V
        71: return
        LineNumberTable:
        line 9: 0
        line 10: 22
        line 11: 27
        line 13: 32
        line 14: 57
        line 15: 71
        Exceptions:
        throws java.lang.NoSuchMethodException
        MethodParameters:
        Name                           Flags
        args

public void test(java.lang.String, java.lang.Integer);
        descriptor: (Ljava/lang/String;Ljava/lang/Integer;)V
        flags: ACC_PUBLIC
        Code:
        stack=0, locals=3, args_size=3
        0: return
        LineNumberTable:
        line 18: 0
        MethodParameters:
        Name                           Flags
        name
        age
        }
// 后方省略。。。

-g: 

// 前方省略。。。
public static void main(java.lang.String[]) throws java.lang.NoSuchMethodException;
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
        stack=6, locals=4, args_size=1
        0: ldc           #2                  // class com/example/demo/demos/Test
        2: ldc           #3                  // String test
        // 这块省略。。。
        66: invokeinterface #20,  2           // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V
        71: return
        LineNumberTable:
        line 9: 0
        line 10: 22
        line 11: 27
        line 13: 32
        line 14: 57
        line 15: 71
        LocalVariableTable:
        Start  Length  Slot  Name   Signature
        0      72     0  args   [Ljava/lang/String;
        22      50     1 method   Ljava/lang/reflect/Method;
        27      45     2 parameterCount   I
        32      40     3 parameters   [Ljava/lang/reflect/Parameter;
        Exceptions:
        throws java.lang.NoSuchMethodException

public void test(java.lang.String, java.lang.Integer);
        descriptor: (Ljava/lang/String;Ljava/lang/Integer;)V
        flags: ACC_PUBLIC
        Code:
        stack=0, locals=3, args_size=3
        0: return
        LineNumberTable:
        line 18: 0
        LocalVariableTable:
        Start  Length  Slot  Name   Signature
        0       1     0  this   Lcom/example/demo/demos/Test;
        0       1     1  name   Ljava/lang/String;
        0       1     2   age   Ljava/lang/Integer;
        }
// 后方省略。。。

这里多了一个LocalVariableTable,即局部变量表,就记录着我们方法入参的形参名字。既然记录着了,这样我们就可以通过分析字节码信息来得到这个名称了


获取方法参数名的方式

虽然Java编译器默认情况下会抹去方法的参数名,但有上面介绍了字节码的相关知识可知,我们还是有方法来得到方法的参数名的。

方法一:使用-parameters(最简单直接)
java8原生支持,直接通过java.lang.reflect.Parameter就能获取到

方法二:借助ASM(推荐)

它是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能,它能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
这样我们就可以通过ASM来分析字节码信息中的本地变量表获取方法参数名了。


总结

为什么我们使用的框架中,比如Spring MVC可以获取方法参数名

spring-core中有个ParameterNameDiscoverer就是用来获取参数名的,底层用的是asm解析,但是接口方法的参数名无法得到,即只能是非接口类的方法参数名可以

可是平时我们开发spring MVC项目都没有显式添加-g编译参数Spring MVC是怎么获取方法参数的?
因为,maven默认是添加了-g选项的

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
      <debug>true</debug>     //默认,无需显式配置
      <compilerArgument>-g</compilerArgument>  //默认,无需显式配置
    </configuration>
  </plugin>
</plugins>
  • 1.要想在运行时获取方法的参数名,首先class文件中得有参数名才可以
  • 2.spring mvc底层是通过asm获取的字节码中的方法参数名
  • 3.javac可以通过添加-g或者-parameter选项在class文件中添加参数信息
  • 4.maven编译插件默认添加了-g选项
Python实战:打造学生信息管理系统 通过本教程,我们构建了一个简单的学生信息管理系统,实现了基本的添加、删除、修改和查询功能。当然,这个系统还有很多可以改进和扩展的地方,比如添加用户界面、增加数据持久化功能、支持批量操作等。简介:本文将介绍如何使用Python编写一个功能齐全的学生信息管理系统,包括添加、删除、修改和查询学生信息的基本操作。学生信息管理系统是学校日常管理中不可或缺的一部分,它能够帮助管理人员快速、准确地管理学生信息,提高工作效率。为了实现上述功能,我们可以设计一个包含学生信息的字典,并使用函数来封装各个操作。 阅读详情

相关推荐

VC中基于TWAIN协议控制扫描仪-----初级版

PS:本人是C++小白一枚,在研究此功能时不知走了多少弯路

a1101000099的专栏 8788

Java8获取参数名称

Java8获取参数名称 前言 在mybatis的源码学习中,知道了mybatis可以开始在Java8将参数名称作为映射名称,Java8一项新的特性——在class文件中保留参数名。 通过反射获取参数名称 Java8中反射包出现了新的方法,Method.getParameters(),可以获取Parameter数组。而以前只能使用Method.getParameterTypes()获取Class数组。 import java.lang.reflect.Method; import java.lan

aa1358075776的博客 1073

SAP-HR 模块 PPOSE 的详细信息标签页增强

步骤1:T-CODE : SE11 创建一个名为 HRI9106 的结构 命名:HRI + 91 + 两位数字。人事管理 - 组织管理 - 集成新信息类型 - 将信息类型添加为明细范围中的标签页。步骤6:SE51 查看 7000屏幕,修改屏幕属性 让其更美观。步骤3:T-CODE : SM30维护 T777I 表。步骤5:PPCI 新建 7000屏幕用于显示。标签页 IT 开头 + 信息类型 9106。步骤2:T-CODE : PPCI。步骤4:T-CODE : SPRO。

常回来看看呀!! 1627

java基础- 注解和反射

1. 注解(Annotation) 1. 什么是注解 Annotation是从JDK5.0开始引入的新技术。 Annotation的作用 : 不是程序本身,可以对程序作出解释。(这一点和注释(comment)没什么区别) 可以被其他程序(比如:编译器等)读取。 Annotation的格式: 注解是以"@注释名"在代码中存在的, 还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”). Annotation在哪里使用 ? 可以附加在类、方法、

清枫逐的博客 638

Ardupilot姿态控制详解(完结篇)

本文主要是对过去写的一些APM中姿态控制流程及函数博文的汇总。 按照之前写的博文以及个人认为的学习顺序,给出APM姿态控制器的学习顺序如下: APM姿态旋转理论基础 Ardupilot姿态控制器 PID控制流程(整定后的P控制器) 详解APM的开方控制器sqrt_controller Ardupilot前馈及平滑函数input_euler_angle_roll_pitch_yaw解析 Ardupilot倾转分离函数thrust_heading_rotation_angles Ardupilot四元数姿态控制

moumde的博客 7023

上海市大数据中心笔试模拟试卷

为帮助考生熟悉上海市大数据中心笔试的题型、考点及答题逻辑,以下整理了一份的模拟试卷,涵盖大数据专业知识、行政职业能力测试(行测)、公共基础知识(含上海本地政策)三大核心模块,并附详细答案解析。

一叶之秋的博客 1815

反射中Method的getParameters()方法获取真实参数名

IDEA指定-PARAMETERS MAVEN指定-PARAMETERS <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>

L13158562070的博客 2081

具身智能端到端大模型VLA (Vision Language Action)

在语言为条件的机器人任务中,策略必须具备理解语言指令、视觉感知环境并生成适当动作的能力,这就需要VLA的。例如,在自动驾驶领域,传统的做法是将感知、预测、规划等步骤分开处理,而VLA则试图用一个统一的框架来替代这种分立的方法。另外,VLA的模型对于算力的需求很大,单片AI算力1000Tops的Thor大概率会延期发布,加上英伟达芯片的量产时间与成本挑战,以及在国内的应用情况,对车企而言是个大问题。以谷歌DeepMind推出的RT-2为例,该模型可以在新的物体、背景和环境中表现出显著改善的性能。

具身智能机器人 1万+

java获取方法参数中名称

前言 我们知道java可以通过反射得到方法名、参数类型等信息。但我们似乎不能直接得到方法的参数名。而在一些场景中,比如构建自己的MVC框架时,我们也想像Spring MVC一样,根据参数名获取用户传来的数据。下面就来总结一下,都有哪些方法可以获得方法的参数名。 1. 使用java8 自java8开始,可以直接通过反射得到方法的参数名。取代了之前如arg0、arg1 等无含义的参数名称。不过这样有个条件:你必须手动在编译时开启-parameters 参数,否则还是获取不到。 以IDEA为例,你需要在Prefe

夏天 2546

FFTW库安装与使用(3.3.5版本)

FFTW库安装与使用一、FFTW库介绍与下载二、FFTW库安装三、FFTW库测试 一、FFTW库介绍与下载   FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的DFT,且运行速度比Eigen和opencv自带的FFT库函数快10倍以上。   下载链接:http://www.fftw.org/install/wind

Jhon_ranble的博客 2万+

图神经网络实战(8)——图注意力网络(Graph Attention Networks, GAT)

图注意力网络 (Graph Attention Networks, GAT) 是对图卷积网络 (Graph Convolutional Network, GCN) 的改进,提出了一种通过自注意力 (self-attention) 过程计算的加权因子,而不是使用静态的归一化系数。在本节中,我们介绍了 GAT 架构。通过从线性变换到多头注意力的四个主要步骤,了解了 GAT 的工作原理,并在 NumPy 中从零开始构建了 GAT 层。最后,将 GAT 模型应用于 Cora 和 CiteSeer 数据集。

盼小辉丶的博客 1万+

Java-Method类常用方法总结

该文章参考至:https://blog.youkuaiyun.com/Goodbye_Youth/article/details/84036809,本文章仅仅修改了一些个人的理解 一、Method方法的意义 用于获取当前运行方法的信息 二、包含的常用方法 invoke():参数为类的具体实例对象,实现对方法的动态调用 getAnnotatedReturnType():返回一个AnnotatedType对象...

996程序员的自我修养 3332

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 497

java如何获取方法参数名

在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些操作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为HTTP请求的参数名,它是怎么做到的呢? 在这样情况下

痴人说梦 4万+

ssm框架搭建

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java反射获取方法的参数名

java反射获取方法的参数名 从JDK8开始,反射类添加了Parameter,通过Parameter类,我们可以从.class编译后的文件中获取方法上参数名。 获取参数名的方法:Parameter.getName() 示例: public static List<String> getParameterNameJava8(Class clazz, String methodName) ...

weixin_45520214的博客 1923

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 获取方法的参数名

Java获取方法的参数名 引言 在Java中,获取方法的参数名是一项常见的需求,特别是在一些框架或工具中需要使用参数名来进行一些操作。本文将介绍如何在Java中获取方法的参数名,以及教会刚入行的小白如何实现这个功能。 流程概述 为了方便小白快速理解,我们可以通过以下表格展示获取方法参数名的整个流程: 步骤 操作 ...

weixin_41071349的博客 458

深度学习工具包 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 获取方法中的参数,Java获取代码中方法参数名信息的方法

前言大家都知道随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射.如下的代码参考所示:?按java8之前,也可以通过一些手段拿到参数名信息,只不过方...

weixin_42545159的博客 2243

java 反射获取方法参数名的方式总结

1、参数名获取的本质所有方案都依赖编译时保留参数名信息(通过-parameters或-g参数), 所以编译的时候有就是有,没有就是没有,尤其是一些第三方依赖的类如果是第三方依赖的类若未携带调试信息(如未使用上述编译参数进行编译),则无论如何也是无法获取真实参数名, 除非第三方库已使用-parameters编译,仍可通过反射获取(但实际场景较少见)2、版本适配建议JDK8+项目:优先使用编译参数(性能最佳), 配合JDK7及以下: 使用-g编译参数, 配合Spring项目: 推荐使用。

BurukeYou 1417

Java反射获取方法真实参数名

最近在手撸框架的时候遇到了比较迷惑的bug:利用反射获取Controller类中方法的参数列表,然后取出参数名,从前端传回来的数据中找到对应的值注入;这时候除了异常,打了断点发现hello()方法的两个参数名为 arg0 和 arg1,导致了参数注入失败。 import org.apache.commons.lang3.ArrayUtils; import java.lang.re...

weixin_44152096的博客 1444

java 反射 参数名_JAVA反射获取方法参数名

默认情况下,我们是无法获取方法中参数的名称,通过反射机制也只能过去参数的顺序以及一些表意名:arg0、arg1等等;当我们面对,比如文档化服务接口的详细信息时,就会比较麻烦。因为源文件在编译时,不会将参数名称等相关meta信息记入class文件;JDK 8之后,我们可以通过在编译时指定“-parameters”选项,来实现将方法的参数名记入class文件,并在运行时通过反射机制获取相关信息。如果你...

weixin_39795325的博客 697

java method 参数名_获取java代码中方法的参数名信息

随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射.如下的代码参考所示:按java8之前,也可以通过一些手段拿到参数名信息,只不过方式不同而已.如通...

weixin_42619742的博客 1597

java method 参数名_Java获取代码中方法参数名信息的方法

前言大家都知道随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射.如下的代码参考所示:public class T {private interfa...

weixin_42349295的博客 1277

Java 8:通过反射获取方法参数名

Java 8:通过反射获取方法参数名 Published: 15 Apr 2014 Category: Java 出处:Java 8:通过反射获取方法参数名 英文原文链接 JDK 8中一个很少被提及的特性就是它可以方法参数的元信息存储...

chongxungu8275的博客 198

javassist:增强型的java反射工具,获取方法参数名,获取方法参数标注值

java的反射是不能获取方法的参数名的。比如: public String concatString(String param1,String param2){ return param1+param2; } 想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist就可以获得。 1 public static v

shizhan1881的专栏 2800

java获取方法参数名_java如何获取方法参数名

用反射机制,简单写了一个例子,不懂的可以看一下相关api public class OwerMethodParam {public static void main(String[] args) {new OwerMethodParam().test("bb");}public void test(String aa) {Method[] methods = OwerMethodParam.cla...

weixin_29132813的博客 434

java 获取方法参数_JAVA获取方法参数名的分析(一)

关于题目首先解释一下题目. 我们知道, Java通过反射,可以从一个类得知它有哪些方法,有哪些变量,也可以知道每个方法中有哪几个什么类型的传入参数。但有一个东西反射取不到,那就是我们对方法传入参数的命名。取得传入参数的名字有什么意义?对这个问题的探究,源于在写一个测试类时候的需求。假设我们有一个类需要测试,这个类中有数十个方法。为每个方法编写测试类,将耗费大量的时间和精力。因此我有一种想法,就是通...

weixin_32350885的博客 755
上一篇: Java - 内部类
下一篇: Java - java.util.Date和java.sql.Date的区别
「已注销」
博客等级 码龄5年 413粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值