網頁

2019/4/17

Java Reflection Class.getMethods() 與 Class.getDeclaredMethods() 的差別

Java 反射(reflection) Class.getMethods()Class.getDeclaredMethods() 的差別如下。

getMethods()僅能回傳public方法,但也能回傳繼承來的方法,也就是父類別的方法,當然也必須是public的方法。

getDeclaredMethods()能回傳此類別所宣告的所有方法,包括privatedefaultprotected等,但不能回傳繼承來的方法,也就是不能回傳父類別中的任何方法。

例如下面FooBar類別中有不同存取範圍的方法,且Foo繼承Bar

Bar

class Bar {

    public void barPublicMethod() {}
    protected void barProtectedMethod() {}
    void barDefaultMethod() {}
    private void barPrivateMethod() {}
    
}


Foo

class Foo extends Bar {

    public void fooPublicMehtod() {}
    protected void fooProtectedMethod() {}
    void fooDefaultMethod() {}
    private void fooPrivateMethod() {}
    
}

測試getMethods()getDeclaredMethods()取得的方法。

Main

public class Main {

    public static void main(String[] arges) {

        Class fooClass = Foo.class;
        Method[] fooMethods = fooClass.getMethods();
        for (Method method : fooMethods) {
            System.out.println(method.getName());
        }

        System.out.println("=====================================");

        Method[] declaredFooMethods = fooClass.getDeclaredMethods();
        for (Method method : declaredFooMethods) {
            System.out.println(method.getName());
        }

    }

}

印出結果如下。

fooPublicMehtod
barPublicMethod
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
=====================================
fooPublicMehtod
fooProtectedMethod
fooDefaultMethod
fooPrivateMethod


沒有留言:

張貼留言