为什么在java中使方法变为volatile?

Raj*_*Raj 18 java android

为什么方法会变得不稳定?如何使方法volatile改变方法的行为?

编辑:我在类对象(Java反射)返回的Method对象上执行了toString().返回字符串具有针对方法名称的volatile修饰符以及公共可见性和void返回类型.研究仅得出有关物业挥发性的信息.这就是我问这个问题的原因.

方法声明是:

public volatile org.osmdroid.api.IGeoPoint org.osmdroid.views.MapView.getMapCenter()
Run Code Online (Sandbox Code Playgroud)

反射方法的代码:

public static class Test {
    public static void showMethods(Object target) {
        Class<?> clazz = target.getClass();
        for (Method method : clazz.getMethods()) {
            if (method!=null) {
                System.out.println(method.toString());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

方法调用:

Test.showMethods(mapView);
Run Code Online (Sandbox Code Playgroud)

Cow*_*wan 39

我强烈怀疑你所看到的是JLS为字段定义以下位的事实的副作用:

public static final int VOLATILE = 0x00000040;
Run Code Online (Sandbox Code Playgroud)

以及方法的以下位:

static final int BRIDGE = 0x00000040;
Run Code Online (Sandbox Code Playgroud)

请注意,它们具有相同的值(相同的位对于方法和字段具有不同的含义).

如果你Modifier.toString(int)没有打电话,如文件所示:

请注意,要对已知类型的实体(例如构造函数或方法)执行此类检查,请首先toString使用类似于constructorModifiers或的方法使用适当的掩码参数methodModifiers.

然后你会得到不合适的输出(包括桥接方法,自动生成例如协变返回类型,显示为'volatile').

至少目前的OpenJDK Method.toString()过滤掉了这个; 如果你的不是,也许你正在使用不正确的JDK版本.


Jon*_*eet 16

你不能.volatile仅是字段的有效修饰符.

  • 但是`volatile`位被重用为`bridge method`位(请参阅我的回答),所以我怀疑这是一个简单的bug. (4认同)

Jas*_*ers 9

你读了...吗

http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html


只是为了完成答案:

正如其他人都指出的那样:你不能让方法变得不稳定.

  • 这应该是一个评论. (2认同)