[英]How to invoke child class method from parent class through reflection
I want to create a menu which should be populated by arbitrary methods, which are marked by an annotation. 我想创建一个菜单,该菜单应由任意方法填充,并用注释标记。 The methods should be invoked from inside the base class. 这些方法应从基类内部调用。 Unfortunately 'java.lang.ClassCastException' is thrown since the method.invoke
function expects an object which is instance of the child class. 不幸的是,抛出了“ java.lang.ClassCastException”,因为method.invoke
函数需要一个作为子类实例的对象。 But i only get the base class. 但是我只得到基类。
Here is what i tried so far : 这是我到目前为止尝试过的:
public abstract Class BaseClass{
private void invokeSomeMethod(){
final Method[] methods= getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MenuFunction.class)) {
MenuFunction menuFunction = method.getAnnotation(MenuFunction.class);
menuFunction.invoke(this); //Throws 'java.lang.ClassCastException'
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ METHOD })
public @interface MenuFunction {
String Label();
}
}
public Class ChildClass extends BaseClass{
@MenuFunction(Label = "First method")
public void setHigh(){
//Arbitrary function
}
@MenuFunction(Label = "Another method")
public void setLow(){
//Do something
}
}
I guess what you want to do is this: 我猜你想做什么是这样的:
public abstract class BaseClass { 公共抽象类BaseClass {
public void invokeSomeMethod() throws InvocationTargetException, IllegalAccessException {
final Method[] methods = getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MenuFunction.class)) {
MenuFunction menuFunction = method.getAnnotation(MenuFunction.class);
method.invoke(this); //invoke method here'
}
}
}
} }
public class ChildClass extends BaseClass{
@MenuFunction(Label = "hello")
public void hello() {
System.out.println("hello");
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
new ChildClass().invokeSomeMethod();
}
}
Result: 结果:
hello 你好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.