是否有可能找出方法的参数是否是最终
的?我试过这个:
int modifiers = method.getParameters()[0].getModifiers() // modifiers == 0
但是,即使第一个参数有< code>final修饰符,< code>modifiers也被设置为零。
编辑:我真的不认为我的问题是重复的。当我使用类成员(例如字段、方法等)尝试此代码时,它可以完美地工作。但是使用方法参数getModifier
失败!
edit2:在你建议我的问题中,我没有找到答案,所以你能帮助我,如何检查参数是否是最终的?
经过简短的研究,恐怕这是不可能的。请参阅有关此问题的第一条评论
如果你看一个反编译的类,你可以看到编译器从所有的final参数中删除了final关键字。这是合理的,因为final只有在编译时才有意义。
我试图找到更多的证据,但失败了。无论如何,我做了一个小测试,基于第一个建议的dubes答案。
有像这样的测试课
public class TestClass {
public void testMethod(final Integer param) {} // could be also int
}
并运行此html" target="_blank">测试/日志记录
@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 INFOorg.example.jpa.JUnitTest:33-方法public valorg.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer)
2017-12-11 13:11:24.521 INFOorg.example.jpa.JUnitTest:36-params[0]java.lang.Integeralg0
2017-12-11 13:11:24.521 INFOorg.example.jpa.JUnitTest:37-修饰符0
2017-12-11 13:11:24.522 INFOorg.example.jpa.JUnitTest:38-最终false
因此,编译方法声明中似乎不存在唯一允许的方法参数修饰符 final
。请注意,它在记录的方法签名中都不存在
public void org.example.jpa.JUnitTest$TestClass.testMethod(java.lang.Integer)
来自< code >修饰符的源代码
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;
}
因此,为了说明方法参数被声明为< code>final,第二位应该是1。
问题内容: 我有一个对象,我想知道它的返回类型是否为。 我已经检查了Javadocs,并且有一个返回Class对象的方法。问题是,如果方法无效,他们不会说返回类型是什么。 谢谢! 问题答案: 快速样本:
问题内容: 我试图通过反射获取静态私有属性的值,但失败并显示错误。 我得到的异常是: 而且,我需要使用以下代码来调用一个私有的。 但是问题是Student类是单例类,并且构造函数是私有的,并且无法访问。 问题答案: 您可以将字段设置为可访问:
问题内容: 我正在遍历Jar文件中的类,希望找到那些不是抽象的类。我可以通过实例化类并捕获InstantiationException来解决此问题,但是由于某些类的启动工作量很大,因此性能会受到影响。我在Class.java文档中找不到明显类似于isAbstract()的东西。 问题答案: 当您在类对象上调用getModifiers()时,它将抽象作为其修改器之一。 该链接应该有所帮助。 也: h
问题内容: 在Java中,我们不能覆盖final方法,但是有可能重载吗? 问题答案: 是的,重载最终方法是完全合法的。 例如:
我有以下代码来检索http和https的默认,它通过访问静态包作用域方法,在Java8中工作: 这在jigsaw的Java9中仍然是可能的,还是禁止以这种方式修改可见性?