Tag: 方法签名

如何使用Javareflection获取参数名称

如何使用Javareflection获取方法签名? 编辑: 我实际上需要参数NAMES而不是方法的类型。

什么是“覆盖等价”,它与@Override有什么关系?

读取@Override注释的Javadoc ,我遇到了以下规则: 如果使用此注释类型注释方法,则编译器需要生成错误消息,除非至少满足下列条件之一: 该方法会覆盖或实现在超类型中声明的方法。 该方法的签名覆盖等效于Object中声明的任何公共方法。 我对第一点很清楚,但我不确定第二点。 “覆盖等价”是什么意思? 在这方面, Object公共方法如何特殊? 为什么这不属于第一个标准? 更新说明:这仅适用于Java 7文档。 Java 6 doc没有提到有关覆盖等价的任何内容。 为什么要改变? 更新: 在咨询了JLS( 第8.4.2节 )之后,我发现了以下对覆盖等价的解释: 方法m1的签名是方法m2的签名的子签名,如果: m2与m1具有相同的签名,或 m1的签名与m2签名的擦除( §4.6 )相同。 如果m1是m2签名或m2是m1签名,则两个方法签名m1和m2是覆盖等价的 。 据我所知,这回答了第一个问题(“它是什么意思?”)和第三个问题(“为什么第一个条件不包括这个?”)。 如果我理解正确(如果我不理解,请通知我!),只有一种情况,两种方法是覆盖等价的, 并且不属于原始问题的第一个条件。 当子类方法的签名的擦除与超类方法的签名相同时,情况就是这种情况,而不是相反。 因此,当我们在尝试“覆盖” Object类的公共方法时尝试添加类型参数时,原始问题的第二个条件才会发挥作用。 我尝试了以下简单示例来测试它,使用未使用的类型参数: public class Foo { @Override public boolean equals(Object obj) { return true; } } 当然,这个类不编译,因为该方法实际上并没有覆盖equals方法,因此与它发生冲突。 但是我仍然收到使用@Override注释的错误。 假设这是@Override使用的第二个条件的有效示例,我错了吗? 或者编译器是否生成此错误, 尽管不需要 ?

计算Java函数的签名

有没有办法计算 Java类的方法的签名? 一个签名 like ([Ljava/lang/String;)V表示一个以String[]为参数的函数 并返回void 。 计算签名的规则是什么?

Java字节码签名

作为我正在编写的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我试图解析并转换为AST。 解析算法大多数都有效,但似乎有一种特殊情况,这些签名的格式有点奇怪。 以下是一些这样的情况: java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.lang.Class#getAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getAnnotationsByType: (Ljava/lang/Class;)[TA; java.lang.Class#getDeclaredAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getDeclaredAnnotationsByType: (Ljava/lang/Class;)[TA; java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.util.Collections#sort: <T::Ljava/lang/Comparable;>(Ljava/util/List;)V 在这些类中的所有方法中,这些是唯一在其签名中具有::的方法。 我的问题是这个令牌的作用以及它存在的原因。 编辑 我知道Java语言中的::运算符,但这是字节码级别的东西。

方法签名中的最终关键字

可能重复: 接口方法中的最终参数 – 重点是什么? 在尝试尝试一些事情时,我遇到了一个问题,就在本页中描述了这个问题。 interface B { public int something(final int a); } abstract class C { public int other(final int b); } class A extends C implements B { public int something(int a) { return a++; } public int other(int b) { return b++ } } 为什么这样的function可能? 我不知道为什么可以通过覆盖方法将最终参数变成非最终参数。 为什么在方法签名中忽略final关键字? 如何强制子类在其方法中使用最终变量?

为什么varargs应该是方法签名中的最后一个?

如果我尝试编写如下方法 public void someStuff(Object … args, String a ) 我收到这个错误 someStuff方法的变量参数类型Object必须是最后一个参数。 我不完全理解变量参数类型的要求是最后一个。 任何输入都会有所帮助。