我希望在子类中初始化一系列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猜测的那样,我“想要一个超类来调用子类中定义的一组特定方法”。
答案 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");