6

这个很奇怪。我有以下代码:

class A
{   
    protected A clone() throws CloneNotSupportedException
    {
        return (A) super.clone();       
    }
}

当我通过“showmycode.com”反编译它的字节码时,它向我展示了以下代码:

class A
{

    A()
    {
    }

    protected A clone()
    throws clonenotsupportedexception
    {
        return (A)super.clone();
    }

    protected volatile object clone()
    throws clonenotsupportedexception
    {
        return clone();
    }
}

在第二个“克隆”方法中,方法返回类型易变意味着什么?(这段代码是通过 Eclipse 的默认 JDK 1.6 编译器编译的)。

4

4 回答 4

8

这个答案已经在问题Why make a method volatile in java? 但这里有更多信息。

当您重载方法时(可能只有超类中的泛型方法),该方法被标记为“桥接方法”。来自java.lang.reflect.Modifier

static final int BRIDGE    = 0x00000040;

不幸的是,这与用于将字段标记为的位相同volatile

public static final int VOLATILE         = 0x00000040;

如果您在该方法上打印修饰符,您将看到如下内容:

public volatile

这是Modifiers.toString(int)方法中的一个限制,不知道它是字段还是方法。

public static String toString(int mod) {
    StringBuffer sb = new StringBuffer();
    ...
    if ((mod & VOLATILE) != 0)  sb.append("volatile ");
    // no mention of BRIDGE here
    ...
    return sb.toString().substring(0, len-1);
}
于 2014-01-13T22:15:21.783 回答
4

这并不意味着什么。这是反编译器中的一个错误。故事结局。

(这个错误可能与类文件格式中使用的某些标志位“重载”有关,这意味着在类、字段或方法的上下文中不同的东西。我也隐约记得有一些“新用途” “在最近的 JVM 规范修订中。)

于 2012-04-29T06:38:48.087 回答
4

字段和方法的修饰符掩码相似但不完全相同。反编译器最有可能使用toString这里的方法

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/reflect/Modifier.java

但它没有做的是处理所有位

// Bits not (yet) exposed in the public API either because they
// have different meanings for fields and methods and there is no
// way to distinguish between the two in this class, or because
// they are not Java programming language keywords

它不处理的是可以表示syntheticbridge识别编译器生成代码的位。

如果volatile在这里根本没有任何意义,则可能意味着即使该方法没有做任何事情,也不要删除该方法。

于 2012-04-29T08:21:10.330 回答
1

这是您的反编译器中的一个错误。

volatile只是字段的有效修饰符。

我建议你阅读这篇文章。

于 2012-04-29T05:57:48.430 回答