2016-09-06 44 views
1

類是這樣的:一種方法是受保護的,但我通過反射得到了方法的修飾符,修飾符是公開的。 IDE的是Android工作室

public class MethodSubject { 

    public String getString(String str) { 
     return "hello"; 
    } 

    protected void setStr(String str) { 

    } 

    int getID(int t) { 
     return 100; 
    } 

    private void setID(int id) { 

    } 
} 

然後,我使用反射來獲取方法

Class<MethodSubject> clz=MethodSubject.class; 
Method[] methods=clz.getDeclaredMethods(); 
for(Method method:methods){ 
    int modifier=method.getModifiers(); 
    if ((modifier& Modifier.PUBLIC)==1){ 
     Log.e("target,",method.toString()); 
    } 
} 

然後,日誌是:

public int ...MethodSubject.getID(int) 
public String ...MethodSubject.getString(java.lang.String) 
public void ...MethodSubject.setStr(java.lang.String) 

爲什麼修改改變了?

+0

您確定您在查找正確的日誌?因爲我剛剛測試過你的場景,並且它的打印方法名稱不是帶有保護修飾符 –

+0

,與我一樣,是不可或缺的 –

+0

我非常確定我在說什麼。我在Eclipse中測試這些代碼,它工作正常。但是,如果它在AndroidStuio中工作,日誌就是我在那裏寫的。 – Lyri

回答

0

我覺得你的設置中有些東西是錯誤的。我只是在這裏跑了這個簡單的測試:

import java.lang.reflect.*; 

public class Test { 

void foo() { }; 
public void bar() {}; 
protected void foobar() {}; 

public static void main(String[] args) { 
    Class<Test> clz = Test.class; 
    Method[] methods=clz.getDeclaredMethods(); 
    for(Method method:methods){ 
    int modifier=method.getModifiers(); 
    if ((modifier& Modifier.PUBLIC)==1){ 
     System.out.println("target: " + method.toString()); 
    } 
    } 
} 
} 

如預期,即打印:

target: public void Test.bar() 
target: public static void Test.main(java.lang.String[]) 

結論:java的行爲與預期相同;你的設置中有些東西是錯誤的。

+0

我在eclipse中測試,它工作正常。但是,我在AndroidStuio中測試,日誌不正確。 – Lyri