如何从Java中的Class.forName()获取方法?

时间:2013-07-22 17:18:00

标签: java

EDITED

我有一个未知的类,只有名为 namo 的字符串变量知道,并且它的方法名为 paintah ,带有 Graphics g 参数。现在我想做:

Class.forName(namo).getMethod("paintah", ??????????);    

我该如何更换问号?我想弄清楚几个小时。

另外,如果我使用相同的代码(但我只知道它的名字 Classo ),就像这样:

new Classo.paintah(g);    

它有效。

更新 好的,我有两个课程,一个有这部分代码:

public static Classo cla = new Classo();
 public void paintComponent(Graphics g){
       Class.forName(namo).getMethod("paintah", Graphics.class); //not working
       cla.paintah(g); // working
}

我们可以说主要类,现在 Classo 与未知类具有相同代码的代码具有以下部分:

public void paintah(Graphics g){
       g.fillRect(20,20,200,200);
}

所以是的,我希望这会给出一个更好的主意..

3 个答案:

答案 0 :(得分:4)

您正在使用getMethod方法,该方法采用Class对象的varargs参数来表示目标方法中参数的类型。

如果仅需Graphics个对象,则提供Graphics.class

Class.forName("bla").getMethod("paintah", Graphics.class);

由于您知道班级名称,因此甚至不需要Class.forName,您可以使用班级文字来访问它。

bla.class.getMethod("paintah", Graphics.class);

无论哪种方式,您都需要抓住Exceptions来电引发的getMethod

  

抛出:

     

NoSuchMethodException - 如果找不到匹配的方法或   如果名称是“”或“”。   NullPointerException - 如果name为null   SecurityException - 如果存在安全管理器s和   满足以下任何条件:

     
      
  • 调用   s.checkMemberAccess(this,Member.PUBLIC)拒绝访问该方法

  •   
  • 调用者的类加载器与之相同或者是祖先   当前类的类加载器和调用   s.checkPackageAccess()拒绝访问此类的包

  •   

答案 1 :(得分:0)

如果您有以下课程:

public class MyClass
{
   public void MyMethod(MyParameterType param);
}

然后你可以得到这样的方法对象:

Class.forName("MyClass").getMethod("MyMethod", MyParameterType.class);

来自 getMethod() javadoc:

The name parameter is a String specifying the simple name of 
the desired method. The parameterTypes parameter is an array of 
Class objects that identify the method's formal parameter types, 
in declared order. If parameterTypes is null, 
it is treated as if it were an empty array. 

答案 2 :(得分:0)

一旦获得方法,就需要调用它。 这里有一个解释:call static method given a class object in java