java.lang.reflect.Method线程安全吗?

java.lang.reflect.Method线程安全吗?

我的程序的性能分析结果表明, Class.getMethod()在多次调用时花费了相当多的计算时间,比我预期的要多一点。 我可以调用一次,并将生成的方法存储在易于访问的地方。 但是,多个Web工作线程将同时使用存储的Method对象。

这样安全吗?

如果在多个线程可用之后不更改方法状态,则可以安全地使用该方法。例如,您可以在两个线程中调用setAccessible(true)和setAccessible(false),结果将不是线程安全的。 然而,这没有什么用处。

简而言之,Method.setAccessible()不是技术上的线程安全,但您应该能够以线程安全的方式使用它。

保证每个ClassLoader实例只定义一次Java类,因此您可以安全地假设定义(包括方法及其签名)不会随时间发生变化,因此您可以安全地“缓存”它们以供多个线程使用。

但是,请记住,具有相同完全限定名称(包+类名称)的类可以通过单独的ClassLoader实例进行不同的定义。

类定义不会改变,所以除非你在不同的线程中加载不同的类(比如说来自不同的库),否则Method对象应该是线程安全的。 (当然,reflection调用方法本身是否是线程安全的是一个不同的问题。)