如果方法的参数是final
,是否可以找出?
我试过这个:
int modifiers = method.getParameters()[0].getModifiers() // modifiers == 0
但即使第一个参数具有final
修饰符,modifiers
也会设置为零。
编辑:我真的不认为我的问题是重复的。当我使用类的成员(例如字段,方法等)尝试此代码时,它完美地工作。但是方法参数getModifiers
失败了!
edit2:在你提出的相似问题中,我没有找到答案......你能帮助我,如何检查参数是否是最终的?
答案 0 :(得分:1)
经过简短的研究,我担心这是不可能的。请参阅有关此question
的第一条评论如果查看反编译的类,可以看到编译器 从所有最终参数中删除final关键字。它是 合理,因为最终只在编译时才有意义。
我试图在此找到更多证据,但未能成功。无论如何,我根据第一个建议的dubes答案做了一个小测试。
有像
这样的测试类public class TestClass {
public void testMethod(final Integer param) {} // could be also int
}
并运行此测试/记录
@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 - 方法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 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。