1. 程式人生 > >Java反射:通過父類物件呼叫子類方法

Java反射:通過父類物件呼叫子類方法

通常情況下在父類中不能直接呼叫子類中的方法(重寫的除外),但是在某些特殊的情況下,需要根據一個父類的物件來呼叫子類的方法,原理就使用java的反射原理。例如:Person類,有一個name屬性

public class Person {
    private String name;
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}
Student類繼承了Person類,添加了一個no屬性,代表學號
public class Student extends Person {
    private String no;
​
    public String getNo() {
        return no;
    }
​
    public void setNo(String no) {
        this.no = no;
    }
}
寫一個main方法,new了一個Student物件,賦值name為test,no為18
public static void main(String[] args) throws Exception {
  Student a = new Student();
  a.setName("test");
  a.setNo("18");
​
  Person p = a;
​
  Method method = p.getClass().getMethod("getNo"); // 父類物件呼叫子類方法(反射原理)
  Object o = method.invoke(p);
  
  System.out.println(p.getName());
  System.out.println(o.toString());
}
執行結果:
test
18

如果是Student重寫了Person中的方法:

public class Student extends Person {
    private String no;
​
    public String getNo() {
        return no;
    }
​
    public void setNo(String no) {
        this.no = no;
    }
    
    @Override
    public String getName() {
        return "rewrited";
    }
}
執行結果是:
rewrited
18