java.lang.reflect.Method调用线程安全吗

java.lang.reflect.Method调用线程安全吗,java,multithreading,Java,Multithreading,我使用org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(对象)获取PropertyDescriptor[],并使用readMethod获取值 getPropertyDescriptors将从缓存中获取方法 因此,对于多线程中的特定类和字段,只有一个方法实例调用invoke() 如果对象的方法是线程安全的,可以在多线程中调用一个方法。invoke()吗? PropertyDescriptor[] pr

我使用org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(对象)获取PropertyDescriptor[],并使用readMethod获取值

getPropertyDescriptors将从缓存中获取方法

因此,对于多线程中的特定类和字段,只有一个方法实例调用invoke()

如果对象的方法是线程安全的,可以在多线程中调用一个方法。invoke()吗?

        PropertyDescriptor[] propertyDescriptors = PropertyUtils.getPropertyDescriptors(object);
        propertyDescriptors[0].getReadMethod().invoke(object)
如果userInfo的每个函数都是线程安全的,()->方法[0]。调用(userInfo))在多线程中运行是否正常

    Method[] methods = UserInfo.class.getMethods();
    for (int i = 0; i < 10; i++ ) {
        new Thread(
            () -> methods[0].invoke(userInfo))
            .start();
    }  
Method[]methods=UserInfo.class.getMethods();
对于(int i=0;i<10;i++){
新线程(
()->方法[0]。调用(userInfo))
.start();
}  

如果一个方法只使用堆栈变量,那么它是线程安全的。堆栈变量的作用域是有限的

查看的源代码,我只看到堆栈变量

因此,
PropertyUtils.getPropertyDescriptors
是线程安全的

。。。但是你的问题是关于
java.lang.reflect.Method
,我看到它依赖于
java.lang.reflect.Method

方法
类没有静态成员,只有位于堆栈上的实例成员。所有的方法都是相似的<代码>方法也没有静态成员的子类<代码>可执行文件实现了它,它还有两个静态代码部分,只有在JVM启动时才会调用:

静态{
//AccessibleObject在初始阶段1的早期初始化
setJavaLangReflectAccess(新ReflectAccess());
}
静态void checkPermission(){
SecurityManager sm=System.getSecurityManager();
如果(sm!=null){
//SecurityConstants.ACCESS\u权限用于检查
//客户机是否有足够的权限击败Java
//语言访问控制检查。
sm.checkPermission(SecurityConstants.ACCESS\u权限);
}
}
AccessibleObject
扩展了无静态成员的
AnnotatedElement

总之,我相信
java.lang.reflect.Method
是线程安全的

java.lang.reflect.Method调用线程安全吗

Mike暗示了这一点,但简单的回答是调用
方法。invoke(…)
是线程安全的,当且仅当方法本身是线程安全的。这意味着if不能更改对象中的任何字段,也不能引用对象中的任何非最终字段


方法.invoke(…)
反射实际上没有什么特别之处。从线程安全的角度来看,直接从多个线程调用该方法会受到同样的审查。

为什么不呢?该方法本身不修改任何内容,因此如果涉及多个线程,则不会出现任何错误。或者您是否担心PropertyDescriptor和相关方法?如果是这样,这是一个单独的问题。@Clashsoft我确信PropertyUtils.getPropertyDescriptors(对象)是线程安全的。方法调用将延迟init methodAccessor。但它应该是线程安全的。methodAccessor作为方法的字段。但是对于一个类和一个方法,每个方法实例都使用相同的methodAccessor实例。我认为Mehod.invoke也是线程安全的。在给定的类中,非静态成员都可以引用相同的对象,并且仍然是类型安全的。它们彼此隔离,因为它们是独立的实例。对于同一个类,在不同的时间调用PropertyUtils.getPropertyDescriptors,将从缓存中返回相同的方法实例。同一个方法实例将在多线程中调用invoke()。我不明白你想说什么我编辑了这个问题。我的意思是()->方法[0]。在多线程中运行invoke(userInfo))是可以的,谢谢?