动态调用java中子类的方法

时间:2014-08-16 08:10:10

标签: java dynamic methods parent-child

我想动态地使用我的子类的方法!       我怎样才能访问子方法?       父类是:

public abstract class A{
    String temp;
    public abstract String getData();

    public void setData(String temp){
         this.temp=temp;
}

和childs类是:

 public class B extends A{

    @Override
    public String getData() {
        return "B--GetData";
    }

    @Override
    public void setData(String temp) {
        this.temp= temp+"-B";
    }

    public class C extends A{

    @Override
    public String getData() {
        return "C--GetData";
    }

    @Override
    public void setData(String temp) {
        this.temp= temp+"-C";

    }
 }

我使用此代码访问我的子类

String parseData(String Name){
    Class<?> cls = Class.forName(Name);
    cls.getMethods();
}

我怎样才能动态调用C类的getData()方法? 感谢

2 个答案:

答案 0 :(得分:1)

您可以这样调用您的方法:

methods[0].invoke(new B(), null); 
you can use `method[1]` or `new C()` based on which method to call and on which object.

以下代码 也显示了如何访问私有方法。 示例:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

class ExitPuzzle extends MyAbstractClass {
    public static void main(String... args) throws IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        Class clazz = MyAbstractClass.class;
        Method[] methods = clazz.getDeclaredMethods();
        System.out.println(Arrays.toString(methods));
        methods[0].setAccessible(true); // needed only if method is non-public
        methods[0].invoke(new ExitPuzzle(), null);
    }

}

abstract class MyAbstractClass {
    private void myMethod() {
        System.out.println("in MyAbstractClass");
    }
}

答案 1 :(得分:1)

public String parseData(String Name) throws Exception {
    Class<?> cls = Class.forName(Name);
    Method[] methods = cls.getMethods();

    for (Method method : methods) {
        if(method.getName().equals("setData")) {
            method.invoke(cls.newInstance(), "Test");
        }
    }
    return null;
}

请尽量使用。

您可以调用以下方法

parseData(C.class.getName());