当前位置: 首页 > 知识库问答 >
问题:

有可能通过反射来确定方法参数是否是最终的吗?

傅旺
2023-03-14

是否有可能找出方法的参数是否是最终的?我试过这个:

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

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

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

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

共有1个答案

崔棋
2023-03-14

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

如果你看一个反编译的类,你可以看到编译器从所有的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中仍然是可能的,还是禁止以这种方式修改可见性?