2015-03-02 141 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(); 
} 
} 

希望这有助于你。