Given the code below:
Parent class:
public class Animal {
//...
}
Subclasses:
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");
}
}
Enum:
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;
}
}
Main 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?
}
}
The code above won't work. How can I access method2 using Class.class reference? How can I cast The generic Animal
class into a subclass given the parameters? If Class.class is not possible, what are the alternatives?
CodePudding user response:
First option, and best option IMO, is to make Animal
abstract and add an abstract method2()
to Animal
. Then you can implement it in Cat
and Dog
and invoke it without using Reflection. Second option, use reflection.
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();
}
}
or without Values
, because that isn't doing much for you like
public static void method(Animal a) {
try {
Method m = a.getClass().getMethod("method2", null);
m.invoke(a, null);
} catch (Exception e) {
e.printStackTrace();
}
}
Both methods output
cat method2