[英]Reflection getDeclaredMethods() and class that is not in classpath
[英]getDeclaredMethods() in Class class
public Method[] getDeclaredMethods() throws SecurityException
有如下文件。
/**
*
* Returns an array containing {@code Method} objects reflecting all the
* declared methods of the class or interface represented by this {@code
* Class} object, including public, protected, default (package)
* access, and private methods, but excluding inherited methods.
<p> If this {@code Class} object represents a type that has multiple
* declared methods with the same name and parameter types, but different
* return types, then the returned array has a {@code Method} object for
* each such method.
*
單個類如何具有兩個具有不同返回類型,相同名稱和相同參數類型的[聲明]方法?
在Java語言中 ,不可能聲明兩個具有相同名稱和參數類型但返回類型不同的方法。
然而,Java虛擬機(JVM)處理方法沒有問題。
有一種方法可以通過使用更具體的返回類型覆蓋基類方法來隱式創建此類方法。
如果一個基類有一個方法Object foo()
,你的類用一個方法String foo()
覆蓋它,那么你的類的.class
文件將有一個合成的(因此不是“可見的”)方法Object foo()
和“normal”方法String foo()
。 Object foo()
方法的存在是為了與想要將您的類視為基類的實例並且不知道String foo()
重寫的類兼容。
此外,一些非Java語言可能允許您顯式地使用這些方法創建類。
一個簡單的例子:
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
public class MultipleMethods implements Callable<String> {
public static void main(String[] args) {
for(Method m: MultipleMethods.class.getDeclaredMethods()) {
System.out.println(m);
}
}
@Override
public String call() {
return "just an example";
}
}
public static void MultipleMethods.main(java.lang.String[])
public java.lang.Object MultipleMethods.call() throws java.lang.Exception
public java.lang.String MultipleMethods.call()
由於類型擦除 , Callable
接口有一個方法java.lang.Object call()
和試圖調用該方法的代碼只會查找該方法,因此,插入了一個所謂的橋接方法來實現協議和委托給實際的實現方法String call()
。 您可以通過Method.isBridge()
識別橋接方法。
當使用沒有泛型的協變返回類型時,會創建相同類型的橋接方法,如本答案所述 。 此外,正如本答案所述,類文件可能是通過Java源代碼之外的其他方式創建的,並且由於JVM可以處理僅在返回類型方面不同的方法,因此這些方法可以出現在這些類中而不具有橋接語義。
順便說一下,在字節碼級別上,即使聲明的字段也按名稱和類型進行區分,因此,如果它們的類型不同,則不需要具有唯一的名稱。 沒有辦法使用Java源代碼生成具有相同名稱的聲明字段的類文件,但是,如上所述,這不是創建類文件的唯一方法。
您可能會混淆getDeclaredMethod() : Method
vs getDeclaredMethods() : Method[]
或privateGetDeclaredMethods() : Method[]
,它們具有不同的名稱。
但是,您可以使用相同名稱,相同返回類型但參數不同的方法。 這是可能的,因為Java中的方法重載 。
為簡單起見,這是一段非常合法的代碼:
public class Test {
public int get(int a) {
return a;
}
public int get() {
return 0;
}
}
這不是:
public class Test {
public int get() {
return 0;
}
public long get() {
return 0;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.