当前位置: 首页 > 面试题库 >

瞬态关键字可以标记方法吗?

金和雅
2023-03-14
问题内容

在一个Java类java.util.Locale中,我发现关键字transient标记了一个方法。

 public final class Locale
    implements Cloneable, Serializable
{
    private static class LocaleNameGetter
        implements sun.util.LocaleServiceProviderPool.LocalizedObjectGetter
    {

        public transient String getObject(LocaleNameProvider localenameprovider, Locale locale, String s, Object aobj[])
        {
            if(!$assertionsDisabled && aobj.length != 2)
                throw new AssertionError();
            int i = ((Integer)aobj[0]).intValue();
            String s1 = (String)aobj[1];
            switch(i)
            {
            case 0: // '\0'
                return localenameprovider.getDisplayLanguage(s1, locale);

            case 1: // '\001'
                return localenameprovider.getDisplayCountry(s1, locale);

            case 2: // '\002'
                return localenameprovider.getDisplayVariant(s1, locale);
            }
            if(!$assertionsDisabled)
                throw new AssertionError();
            else
                return null;
        }

有人可以告诉我为什么会这样吗?


问题答案:

不,它不能,仅对字段有效。您似乎可以通过反编译从.class获取源代码。这是反编译器错误,如果您查看java.lang.reflect.Modifiersrc,您将看到transientvarargs具有相同的值

public static final int TRANSIENT        = 0x00000080;
...
static final int VARARGS   = 0x00000080;

对于字段0x00000080表示transient,对于方法(您的情况)表示varargs。这就是getObjectjava.util.Locale
src中的样子

public String getObject(LocaleNameProvider localeNameProvider,
                        Locale locale, 
                        String key,
                        Object... params) {   <-- varargs

在.class(字节码)中,varargs由Object []表示为最后一个参数+修饰符位7 =
1(0x80)。我猜反编译器是旧的,根本不知道varargs哪个是Java 1.5之后的版本,因此将其打印为transient



 类似资料:
  • 本文向大家介绍Java中的瞬时关键字,包括了Java中的瞬时关键字的使用技巧和注意事项,需要的朋友参考一下 实例变量被标记为瞬态,以指示JVM在序列化包含它的对象时跳过特定变量。该修饰符包含在创建变量的语句中,该语句位于变量的类或数据类型之前。 示例

  • 问题内容: 选项: A.因为Foo实现了Serializable,所以可以序列化Foo的实例。 B. Foo的实例无法序列化,因为Foo包含不可序列化的实例变量v3。 C.如果将v3标记为瞬态,则Foo的实例是可序列化的。 D.b和c 答案:D 说明:即使对象的类实现了,也可能无法序列化,因为它可能包含不可序列化的实例变量。 现在我的问题是: 据我所知,transient 用于关闭序列化。那么在这

  • 本文向大家介绍我们可以在Java中使用此关键字调用方法吗?,包括了我们可以在Java中使用此关键字调用方法吗?的使用技巧和注意事项,需要的朋友参考一下 Java中的“ this”关键字在实例方法或构造函数中用作对当前对象的引用。是的,您可以使用它来调用方法。但是,您只能从实例方法(非静态)中调用它们。 示例 在下面的示例中,Student类具有一个私有变量名称,具有setter和getter方法,

  • 可能重复: 在锚中放置div是否正确? 当我们编写某种“产品列表”时,您只需要一个链接,但它应该包含产品图像、产品名称、产品标题等。我们可以使用contain p或其他标签吗?是否存在跨浏览器问题? 我听说在html5中,一个标签可以包含p标签,但是仍然没有使用它的信心。 一些代码是这样的:

  • 我试图用_analyze API获得关键字标记的多字同义词。API对单字同义词返回预期结果,但对多字同义词不返回预期结果。以下是我的设置和分析链: 为什么analyze API不返回具有同义词类型的“foo bar”和“fooo bar”标记?