众所周知,在Java中,方法名不足以区分不同的方法。
我认为(可能是错误的),要区分一个方法,需要以下信息:
(className, methodName, methodParameters)
此外,
- 如何更有效地内部识别方法?
- 我听说过“方法ID”。这是否意味着上述三元组和整数之间存在映射,因此JVM在解析后仅使用方法ID?
- 如果是这样,它是否驻留在符号表中?
谢谢!
众所周知,在Java中,方法名不足以区分不同的方法。
我认为(可能是错误的),要区分一个方法,需要以下信息:
(className, methodName, methodParameters)
此外,
谢谢!
Java总是通过它们的完全限定名称来区分其语言元素。
假设你在包com.mypackage
中有一个名为MyClass
的类,其中有一个方法myMethod(int a, int b)
,那么Java将使用名称com.mypackage.MyClass.myMethod(int a , int b)
来识别该方法。
为了让你更加了解,当需要解析两个相同的元素时,Java还会考虑类加载器。
它确实会考虑用于加载包含你所引用的方法的类的类加载器。Java中有四种类型的类加载器。你可以阅读java.lang.Thread
类的文档来了解这些。
我不是很明白你想做什么,但我认为仍然有一些可能的答案:
很难知道您在谈论什么。 "方法ID"可以是java.lang.reflect.Method
对象的引用,也可以是下面提到的方法描述符,或者其他任何东西。您在哪里读到的?
我怀疑JVM内部没有这样的表格。我的意思是,我怀疑没有一个全局表格,因为几乎总是从类中检索方法,即使在JVM内部处理它时也是如此,因此可以合理地认为该方法存储在类中。就像我们使用反射检索方法一样:
Class clazz = String.class;
Method method = clazz.getDeclaredMethod("charAt", Integer.TYPE);
System.out.println(method.getName());
String
提供该方法,而不是请求某个util类提供接收int
并来自类String
的方法charAt
。(methodName, methodParameters)
相比于从JVM检索方法并传递类、方法名称和参数类型,您可以直接从类中检索方法,给出类名和参数类型即可。这是微妙的差别,但我认为这就是您想知道的。
即使在我下面提到的JNI描述符中也可以看出这一点。例如,该方法
long f(int i, Class c);
由以下描述符表示:
"(ILjava/lang/Class;)J"