간략한 연구 끝에 나는 불가능하다고 두려워합니다. 당신이 디 컴파일 클래스 보았다 경우이 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이어야합니다.
궁금한 점 : 왜 신경을 쓰나요? –
@ 아이보 넷 나도 그래. 이것은 메소드 매개 변수에 관한 것입니다. 제목은 약간 오도하는 것입니다. – pirho
이 [답변] (https://stackoverflow.com/a/44695589/6413377)은 밀접하게 관련되어 있다고 생각합니다. 제안 된 dupes 메서드를 사용하면'isFinal() = false'을 유도하는'final'에 대해 16을 반환해야 할 때 0을 반환합니다. – pirho