如果方法参数是最终的,是否可以通过反射来确定?
Is it possible to determine by reflection if method parameter is final?
如果method的参数是final
,是否可以查出来?
我试过这个:
int modifiers = method.getParameters()[0].getModifiers() // modifiers == 0
但即使第一个参数有 final
修饰符,modifiers
也会设置为零。
编辑:我真的不认为我的问题是重复的。当我用 class 的成员(例如字段、方法等)尝试这段代码时,它工作得很好。但是使用方法参数 getModifiers
失败了!
edit2:在您向我提出的类似问题中,我没有找到答案...那么您能帮我吗,如何检查参数是否为最终参数?
简单研究了一下,恐怕不行。查看对此
的第一条评论
If you looked at a decompiled class, you could see that the compiler
erases the final keyword from all final parameters. And it is
reasonable because the final makes sense only at compile time.
我试图找到更多关于这个的证据,但失败了。无论如何,我根据第一个建议的 dubes 答案做了一个小测试。
正在测试class喜欢
public class TestClass {
public void testMethod(final Integer param) {} // could be also int
}
和运行这个test/logging
@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:11:24.512 INFO org.example.jpa.JUnitTest:33 - method 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 - modifiers 0
2017-12-11 13:11:24.522 INFO org.example.jpa.JUnitTest:38 - final false
所以似乎编译方法声明中不存在唯一允许的方法参数修饰符final
。请注意,它既不存在于记录的方法签名中
public void org.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer)
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;
}
所以告诉方法参数被声明为 final
第二位应该是 1.
如果method的参数是final
,是否可以查出来?
我试过这个:
int modifiers = method.getParameters()[0].getModifiers() // modifiers == 0
但即使第一个参数有 final
修饰符,modifiers
也会设置为零。
编辑:我真的不认为我的问题是重复的。当我用 class 的成员(例如字段、方法等)尝试这段代码时,它工作得很好。但是使用方法参数 getModifiers
失败了!
edit2:在您向我提出的类似问题中,我没有找到答案...那么您能帮我吗,如何检查参数是否为最终参数?
简单研究了一下,恐怕不行。查看对此
If you looked at a decompiled class, you could see that the compiler erases the final keyword from all final parameters. And it is reasonable because the final makes sense only at compile time.
我试图找到更多关于这个的证据,但失败了。无论如何,我根据第一个建议的 dubes 答案做了一个小测试。
正在测试class喜欢
public class TestClass {
public void testMethod(final Integer param) {} // could be also int
}
和运行这个test/logging
@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:11:24.512 INFO org.example.jpa.JUnitTest:33 - method 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 - modifiers 0
2017-12-11 13:11:24.522 INFO org.example.jpa.JUnitTest:38 - final false
所以似乎编译方法声明中不存在唯一允许的方法参数修饰符final
。请注意,它既不存在于记录的方法签名中
public void org.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer)
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;
}
所以告诉方法参数被声明为 final
第二位应该是 1.