在不使用getDeclaredMethod的情况下接收Java方法

时间:2009-03-13 12:50:42

标签: java reflection initialization

我希望在子类中初始化一系列java方法,作为类字段,如此

void callme() {System.out.println("hi!");}
Method[] actions = new Method[] {&callme,&callme};

并在父类中调用此数组中的所有方法,如下所示:

for (meth:actions) {meth.invoke();}

但是目前我找不到隐式初始化actions数组的方法,而不是通过构造函数。由于未处理的异常,以下内容给出了错误:

Method[] actions = new Method[] {
    this.getClass().getDeclaredMethod("count")
};

如上所述,在将此数组显式初始化为字段时,我无法捕获异常,而不是在构造函数中。

我是java反思的新手,所以这可能是一个显而易见的问题,但我仍然没有在谷歌找到答案,任何帮助都将不胜感激。

由于

P.S。

正如Scott猜测的那样,我“想要一个超类来调用子类中定义的一组特定方法”。

6 个答案:

答案 0 :(得分:3)

你确定反射是正确的吗?通常,具有多个实现它的匿名类的接口将是更好的样式。

您可以编写初始化程序块,以便能够在初始化期间捕获异常。

为什么不使用getMethod()?

答案 1 :(得分:3)

[注意:下面的代码尚未编译,但应该得到这个想法]

我应该回应 - 你想要完成什么?

如果您希望超类调用子类中定义的一组特定方法,则可以执行一些操作。

使用反射,我建议使用注释:

1)定义注释HeySuperclassCallMe(确保保留为RUNTIME)

2)使用HeySuperclassCallMe

注释要调用的方法
@HeySuperclassCallMe public void foo...

3)在您的超类中执行类似

的操作
for (Method m : getClass().getMethods())
  if (m.getAnnotation(HeySuperclassCallMe.class) != null)
     m.invoke(...)

这是一个很好的反思手段。

对于非反思(应该更快,但代码更多):

1)定义一个代表调用的接口

 public interface Call {
     void go();
 }

2)在你的超类中,定义一个

 private List<Call> calls
 protected void addCall(Call call)

3)在子类中,使用addCall:

 addCall(new Call() {public void go() {foo();}} );

4)在超类

 for (Call call : calls)
    call.go();

答案 2 :(得分:2)

查看Apache Commons - Beanutils!它就像是所有反射的包装器,非常容易使用。它包装方法调用,修改属性,查找......

如果您想为Java引入动态,您应该看看动态JVM语言,可以通过简单的包含.jar库来使用它们!在它们上面是Groovy,其中包含java语法并引入了许多动态功能(脚本,快速原型,元对象协议,运行时方法重新定位,动态代理......)。

答案 3 :(得分:0)

这应该有效,因为你的方法确实是在this.getClass()中声明的。 如果它是继承的,则应使用Class.getMethod()代替。

但是,在java中,不是使用函数指针,而是使用想要调用的方法定义接口,并让目标对象实现该接口。

还要考虑使用ArrayList或其他集合类而不是数组。

答案 4 :(得分:0)

我可以通过你的&符号告诉你,你正在用C语言思考。我们并没有真正使用java中函数的指针。

通常,您不会为此使用java反射。正如其他一个海报所说 - 你会创建一个接口,并拥有实现该接口的对象 - 通过直接实现它,或者使用适配器或匿名类:

interface Callable { void callme(); }

Callable[] foo = new Callable[] {
  new Callable() { public void callme() {System.out.println("foo!");}},
  new Callable() { public void callme() {System.out.println("bar!");}}
};

for(Callable c: foo) {
  c.callme();
}

答案 5 :(得分:-2)

在类中创建一个静态方法,它将返回一组声明的方法并正确处理异常。

private static Method[] declaredMethods(Class<T> clazz, String methodName) {
  Method[] result = new Method[1];
  try{
    result[0] = clazz.getDeclaredMethod(methodName);
  } catch (NoSuchMethodException nsme) {
    // respond to the error
  } catch (SecurityException se)  {
    // Respond to the error
  }

  return result;
}

Method[] actions = declaredMethods("count");