2015-03-02 137 views
-1

我真的不知道如何放置問題的標題。 基本上我試圖做一些棘手的東西與Java反映API。 下面是我嘗試做的事:Java反射調用方法「getDeclaredConstructors」

import java.lang.reflect.Constructor; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.Scanner; 

public class Test { 

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException { 
    Scanner in = new Scanner(System.in); 
    String className = in.nextLine(); 
    Class c = Class.forName(className); 
    Object myObj = c.newInstance(); 
    Method m = c.getMethod("getDeclaredConstructors"); 
    Object retn = m.invoke(myObj); 
    System.out.println(retn); 
    in.close(); 
} 
} 

我與輸入測試此: java.lang.String中 我總是得到的輸出:

Exception in thread "main" java.lang.NoSuchMethodException: java.lang.String.getDeclaredConstructors() 
    at java.lang.Class.getMethod(Class.java:1778) 
    at Test.main(Test.java:15) 

我明白方法「 getDeclaredConstructors()「是從類Class.

有人可以告訴我,我在這裏做錯了什麼?我所期待的是類名我給作爲輸入聲明的構造函數的列表,在這種情況下:java.lang.String

編輯:我應該更詳細的我的問題。 我知道我可以執行c.getDeclaredConstructors(),但事實並非如此。

這只是我想要構建的程序的一小部分。 在最終版本中,用戶將提供一個類的名稱作爲輸入,稱爲「java.lang.String」,然後它將提供他希望應用於該類的通用方法。 因此,用戶將輸入「getDeclaredConstructors」,我必須將該名稱的方法應用於類「java.lang.String」。

我只是這樣做,以瞭解我能如何實現這一點。

+5

你爲什麼要加倍反思?你已經有'Class'對象'c'。直接調用'c.getDeclaredConstructors()'。 – RudolphEst 2015-03-02 20:17:25

+0

因爲這只是最終應用程序創建的一小部分。在最終系統中,用戶輸入一個類的名稱,例如「java.lang.String」,然後要求在該類上執行常規方法。因此,用戶可以輸入:「method getDeclaredConstructors」,我必須將方法「getDeclaredConstructors」應用於用戶以前輸入的類。這只是爲了理解我該怎麼做 – luispcosta 2015-03-02 20:27:40

回答

2

返回方法String(在這種情況下),而不是ClassString沒有這樣的方法。

爲什麼你想在第一時間反思這種方法?這是一個公共API。

+0

我想我沒有詳細說明我的問題,我的不好。你能看我的編輯嗎? – luispcosta 2015-03-02 20:33:22

+0

重新編輯,只有當用戶告訴他時,用戶纔會瞭解可用方法的唯一方法,並且您不會告訴他'String.class'存在'getDeclaredConstructors()',因爲它沒有,所以你不會檢索它。總之這個問題沒有意義。 – EJP 2015-03-02 23:11:58

0

我會說,你有一個正確的問題,但用錯誤的方法進行測試。 java.lang.Class的方法可以通過其他類的對象訪問。對於這一個,你可以嘗試從java.lang.Object繼承訪問的方法,如下面,

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.Scanner; 

public class Test { 

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException { 
Scanner in = new Scanner(System.in); 
String className = in.nextLine(); 
Class c = Class.forName(className); 
Object myObj = c.newInstance(); 
Method m = c.getMethod("hashCode"); 
Object retn = m.invoke(myObj); 
System.out.println(retn); 
in.close(); 
} 
} 

希望這有助於你。