繁体   English   中英

如果给定 Class.class 和 object 参考,如何访问子类方法?

[英]How to access subclass method if given Class.class and object reference?

给定以下代码:

家长 class:

public class Animal {
  //...
}

子类:

public class Cat extends Animal {
    public void method2(){
        System.out.println("cat method2");
    }
}

public class Dog extends Animal{
    public void method2(){
        System.out.println("dog method2");
    }
}

枚举:

public enum Values {
    VALUE1("v1", Cat.class),
    VALUE2("v2", Dog.class);

    private String val;
    private Class<?> clazz;

    Values(String val, Class<?> clazz){
        this.val = val;
        this.clazz = clazz;
    }

    public String getVal() {
        return val;
    }

    public Class<?> getClazz() {
        return clazz;
    }

}

总机 class:

public class Main {
    public static void main(String[] args) {
        Animal a = new Cat();
        method("VALUE1", a);
    }

    public static void method(String val, Animal a){
        Values value = Values.valueOf(val);

        value.getClazz().cast(a).method2();// this doesn't work. how to access method2?
    }
}

上面的代码将不起作用。 如何使用 Class.class 参考访问 method2? 在给定参数的情况下,如何将通用Animal class 转换为子类? 如果 Class.class 不可能,有哪些替代方案?

第一个选项,也是 IMO 的最佳选项,是使Animal抽象并向Animal添加一个abstract method2() 然后您可以在CatDog中实现它并在不使用反射的情况下调用它。 第二种选择,使用反射。

public static void method(String val, Animal a) {
    Values value = Values.valueOf(val);
    try {
        Method m = value.getClazz().getMethod("method2", null);
        m.invoke(a, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

或者没有Values ,因为那对你来说没什么用

public static void method(Animal a) {
    try {
        Method m = a.getClass().getMethod("method2", null);
        m.invoke(a, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

两种方法 output

cat method2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM