2017-12-10 30 views
1

메쏘드의 매개 변수가 final이라면 알 수 있습니까? 나는 이것을 시도 : 첫 번째 매개 변수 final 수정을 가지고메소드 매개 변수가 최종인지 여부를 반영하여 확인할 수 있습니까?

int modifiers = method.getParameters()[0].getModifiers() // modifiers == 0 

그러나 경우에도, modifiers은 0으로 설정됩니다.

편집 : 내 질문은 복제본이라고 생각하지 않습니다. 클래스의 멤버 (필드, 메서드 등)와 함께이 코드를 시도하면 완벽하게 작동합니다. 그러나 메서드 매개 변수 getModifiers이 실패합니다!

edit2 : 비슷한 질문으로 저에게 답을 찾지 못했습니다 ... 그래서 매개 변수가 최종인지 확인하는 방법을 알려주십시오.

+0

궁금한 점 : 왜 신경을 쓰나요? –

+0

@ 아이보 넷 나도 그래. 이것은 메소드 매개 변수에 관한 것입니다. 제목은 약간 오도하는 것입니다. – pirho

+1

이 [답변] (https://stackoverflow.com/a/44695589/6413377)은 밀접하게 관련되어 있다고 생각합니다. 제안 된 dupes 메서드를 사용하면'isFinal() = false'을 유도하는'final'에 대해 16을 반환해야 할 때 0을 반환합니다. – pirho

답변

0

간략한 연구 끝에 나는 불가능하다고 두려워합니다. 당신이 디 컴파일 클래스 보았다 경우이 question

에 첫 코멘트를 참조하십시오, 당신은 컴파일러 모든 최종 매개 변수에서 최종 키워드를 삭제합니다 것을 볼 수 있었다. 최종적으로는 컴파일시에만 의미가 있기 때문에 합리적인 것이 입니다.

나는 이것에 대한 더 많은 증거를 찾으려고했지만 실패했다. 어쨌든 제 1 회 제안 된 더빙 응원에 근거한 작은 테스트를했습니다. 11 : 24.512 정보의 org.example

@Test 
public void testIsFinal() throws NoSuchMethodException, SecurityException { 
    Method method = TestClass.class.getMethod("testMethod", Integer.class); 
    log.info("method {}", method); 
    Parameter[] params = method.getParameters(); 
    log.info("params {}", params); 
    log.info("params[0] {}", params[0]); 
    log.info("modifiers {}", params[0].getModifiers()); 
    log.info("final {}", Modifier.isFinal(params[0].getModifiers())); 
} 

로그

2017년 12월 11일 (13)를 기록

public class TestClass { 
    public void testMethod(final Integer param) {} // could be also int 
} 

이 테스트를 실행 같은

갖는 테스트 클래스 /. jpa.JUnitTest : 33 - 메서드 public void org.example.jpa.JUnitTest $ TestClass.testMethod (java.lang.Integer)
2017-12 -11 13 : 11 : 24.521 INFO org.example.jpa.JUnitTest : 36 - params [0] java.lang.Integer arg0
2017-12-11 13 : 11 : 24.521 INFO org.example.jpa.JUnitTest : 37 - 개질제 0
2017년 12월 11일 13 : 11 : 24.522 INFO org.example.jpa.JUnitTest : 38 - 최종 거짓

그래서 만 허용 방법 파라미터 수정 final 컴파일에 존재하지 않는 것으로 보인다 메소드 선언. source code of Modifier

public static final int FINAL   = 0x00000010; 

/** 
    * The Java source modifiers that can be applied to a method or constructor parameter. 
    * @jls 8.4.1 Formal Parameters 
    */ 
private static final int PARAMETER_MODIFIERS = Modifier.FINAL; 

public static boolean isFinal(int mod) { 
    return (mod & FINAL) != 0; 
} 

그래서 방법 매개 변수가 선언했다 얘기는하지도 기록 방법 서명에 존재하지 않음을

public void org.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer) 

에서 참고 d는 final으로 두 번째 비트는 1이어야합니다.