[英]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()
。 然后您可以在Cat
和Dog
中实现它并在不使用反射的情况下调用它。 第二种选择,使用反射。
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.