是否可以通过反射确定方法参数是最终的



是否可以找到方法,如果方法的参数为 final?我已经尝试过:

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

但是,即使第一个参数具有final修饰符,modifiers也设置为零。

编辑:我真的不认为我的问题是重复的。当我使用类成员(例如字段,方法等)尝试此代码时,它可以完美地工作。但是使用方法参数getModifiers失败了!

edit2:在问题中,您建议我,因为我没有找到答案...所以您能帮助我,如何检查参数是否最终?

经过简短的研究,恐怕是不可能的。请参阅有关此问题的第一个评论

如果您看了一个分配的课程,您可以看到编译器 从所有最终参数中删除最终关键字。是的 合理,因为最终只有在编译时才有意义。

我试图为此找到更多证据,但对此失败了。无论如何,我根据第一个建议的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信息org.example.jpa.jpa.junittest:33-方法公共void org.example.jpa.jpa.junittest $ testclass.testclass.testmethod(java.lang.ing.integer)
2017-12-11 13:11:24.521信息org.example.jpa.jpa.junittest:36-参数[0] java.lang.integer arg0
2017-12-11 13:11:24.521信息org.example.jpa.jpa.junittest:37-修饰符0
2017-12-11 13:11:24.522信息org.example.jpa.jpa.junittest:38-最终错误

因此,似乎唯一允许的方法参数修饰符final在编译方法声明中不存在。请注意,它在记录的方法签名

中都不存在
public void org.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer)

来自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;
}

所以说出该方法参数被声明为final,第二位应为1。

相关内容

  • 没有找到相关文章

最新更新