Java 的方法签名与字段类型表示-[Ljava.lang.String;
来源:互联网 发布:淘宝怎样报名天天特价 编辑:程序博客网 时间:2024/06/04 19:47
我们什么时候会接触到 Java 的方法签名呢?在进行 JNI 调用时,还有在看方法重载时。重载的方法是有不同的方法签名的,而是不区分返回值,而实际方法签名还揉入了返回值类型的,还有就是 javap -s 查看方法签名时,如 javap -s java.util.Date。
看来方法签名与我们实际工作的关系还真的不大。倒是有次遇着了,事出于 Struts2 应用中提交表单时报出了下面的错误:
00:43:59.716 [http-8080-4] WARN com.opensymphony.xwork2.ognl.OgnlValueStack - Error setting expression 'version' with value '[Ljava.lang.String;@e18a9a'
ognl.MethodFailedException: Method "setVersion" failed for object cc.unmi.model.Post@ed0cd7
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1285) ~[ognl-3.0.jar:na]
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1474) ~[ognl-3.0.jar:na]
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85) ~[ognl-3.0.jar:na]
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162) ~[ognl-3.0.jar:na]
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27) ~[xwork-core-2.2.1.jar:2.2.1]
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2245) ~[ognl-3.0.jar:na]
at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:77) ~[xwork-core-2.2.1.jar:2.2.1]
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2245) ~[ognl-3.0.jar:na]
at ognl.ASTProperty.setValueBody(ASTProperty.java:127) ~[ognl-3.0.jar:na]
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220) ~[ognl-3.0.jar:na]
at ognl.SimpleNode.setValue(SimpleNode.java:301) ~[ognl-3.0.jar:na]
at ognl.Ognl.setValue(Ognl.java:737) ~[ognl-3.0.jar:na]
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:209) ~[xwork-core-2.2.1.jar:2.2.1]
at com.opensymphony.xwork2.ognl.OgnlValueStack.trySetValue(OgnlValueStack.java:173) [xwork-core-2.2.1.jar:2.2.1]
...........................................................
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) [tomcat-coyote.jar:na]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) [tomcat-coyote.jar:na]
at java.lang.Thread.run(Thread.java:619) [na:1.6.0_20]
Caused by: java.lang.NoSuchMethodException: cc.unmi.model.Post.setVersion([Ljava.lang.String;)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1226) ~[ognl-3.0.jar:na]
... 111 common frames omitted
缺少 setVersion() 方法,看看 Post.java 中确实有啊。注意啦,看那参数是 [Ljava.lang.String;,要是不明白 [L 的用意的话,就很难明白是说不存在 setVersion(String[] args) 方法的。Lxxx; 用来表示对象类型,[ 用来表示数组的。
具体原因是请求中有两个 version 参数,可能是表单中两个,也可能是 url 中一个,表单中也一个;就是用 request.getParameterValue("version") 返回一个数组。其实对于 HttpServletRequest 来说,无论提交的是一个 version 还是多个 version 值,用 request.getParameter("version") 总是取到第一个提交的 version 值,所以这在 struts1 似乎不会出类似的错误。一个或是多个 version 影响的总是 getParameterValue("version") 是否为 null。
解决办法是只留下一个 version 请求参数,这个问题警示了我们要去 JVM 中的数据类型表示法有一定的嗅觉。
下出列出一下 Java 的类型与虚拟机中的表示法:
字节码助记符的前缀
类型代码示例描述bytebbaload从数组装载 byte 类型shortssastore将 short 类型存入数组中intiiload_1从局部变量 1 中装载 int 类型longllcmp比较 long 类型值charci2c把 int 类型数据转换为 char 类型floatffload从局部变量中装载 float 类型doubleddconst_1将 double 类型常量 1.0 压入栈referenceaaaload从数组装载引用类型Java 虚拟机中的保存类型和计算类型
保存类型堆或者方法区中的最小比特数计算类型Java 栈帧中的字长byte8int1short16int1int32int1long64long2char16int1float32float1double64double2reference32reference1基本类型终结符(这个与方法签名就比较亲近了)
终结符类型BbyteCcharDdoubleFfloatIintJlongSshortZbooleanboolean 的终结符不为 B 是让 byte 占用了,long 的终结符不是 L 也是因为让对象终结符占用了。返回值为 void 类型的终结符是 V,对象类型终结符为 L 和 ;,数组类型终结符 [
字段描述符示例
描述符字段声明Iint i[[Jlong[][] windingRoad[Ljava/lang/Object;Object[] stuffLjava/util.Hashtable;java.util.Hashtable ht[[[Zboolean[][][] isReady方法描述符示例
描述符方法声明()Iint getSize()()Ljava/lang/String;String toString()([Ljava/lang/String;)Vvoid main(String[] args)()Vvoid wait()(JI)Vvoid wait(long timeout, int nanos)(Z[Ljava/lang/String;II)Zboolean regionMatches(boolean ignoreCase, int toOffset, String other, in oooffset, int len([BII)Iint read(byte[] b, int off, int len)执行一下 javap -s java.util.Date 来看看 java.util.Date 的所有方法签名,下面列出一个片断:
C:\Documents and Settings\Administrator>javap -s java.util.Date
Compiled from "Date.java"
public class java.util.Date extends java.lang.Object implements java............
public java.util.Date();
Signature: ()V
public java.util.Date(long);
Signature: (J)V
public java.util.Date(int, int, int);
Signature: (III)V
public java.util.Date(int, int, int, int, int);
Signature: (IIIII)V
public java.util.Date(int, int, int, int, int, int);
Signature: (IIIIII)V
public java.util.Date(java.lang.String);
Signature: (Ljava/lang/String;)V
public java.lang.Object clone();
Signature: ()Ljava/lang/Object;
public static long UTC(int, int, int, int, int, int);
Signature: (IIIIII)J
public static long parse(java.lang.String);
Signature: (Ljava/lang/String;)J
public int getYear();
.....................................
表格中的数据来自 《深入 Java 虚拟机》
本文链接 http://unmi.cc/java-signatures-data-types/, 来自 隔叶黄莺 Unmi Blog
- Java 的方法签名与字段类型表示-[Ljava.lang.String;
- Hibernate操作Blob类型字段出现java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.getBlob(Ljava/lang/String;)Ljava/sql/
- [Ljava/lang/String(String类型的JNI字段描述符)
- JNI字段描述符“([Ljava/lang/String;)V” "(II)V" 表示 void Func(int, int);
- Java.lang.String & [Ljava.lang.String
- Struts2中转换Date类型的问题 Ljava.lang.String
- JNI字段描述符[Ljava/lang/String
- Dalvik字节码的类型,方法与字段表示方法
- Dalvik字节码的类型方法与字段表示方法
- java.lang.ClassNotFoundException: [Ljava.lang.String解决办法
- java.lang.ClassNotFoundException: [Ljava.lang.String解决办法
- java.lang.AbstractMethodError: ... Ljava/lang/String
- Java中出现[Ljava.lang.String的问题
- Java中出现[Ljava.lang.String的问题
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava
- 设计模式大汇总,是时候来复习一波了
- Eclipse以 . 开头的文件(Eclipse显示忽略文件)
- java创建文件
- Android框架总结
- 添加Tab页切换效果
- Java 的方法签名与字段类型表示-[Ljava.lang.String;
- 单例模式
- 阿里云服务器被挖矿minerd入侵的解决办法
- 启动vsftpd报错
- 最好用的侧滑删除--SwipeLayout
- Groovy 和 Gradle (Android Studio)基础
- PlSQL DROP 表后找回表和数据
- 微信小程序开发工具 下载,安装,创建新项目和如何导入项目整个过程教程
- 软件设计原则