Ahm*_*gle 21 java reflection jls
我正在使用Java Reflection API,并观察到具有可变参数列表的方法变得短暂.为什么这个以及transient关键字在这种情况下意味着什么?
来自Java Glossary,transient:
Java编程语言中的关键字,指示字段不是对象的序列化形式的一部分.当对象被序列化时,其瞬态字段的值不包括在串行表示中,而其非瞬态字段的值包括在内.
然而,这个定义并未说明方法.有任何想法吗?
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Dummy {
public static void main(String[] args) {
for(Method m : Dummy.class.getDeclaredMethods()){
System.out.println(m.getName() + " --> "+Modifier.toString(m.getModifiers()));
}
}
public static void foo(int... args){}
}
Run Code Online (Sandbox Code Playgroud)
输出:
main --> public static
foo --> public static transient
Run Code Online (Sandbox Code Playgroud)
Boz*_*zho 22
可以在javassist的代码中找到答案的排序AccessFlag
public static final int TRANSIENT = 0x0080;
public static final int VARARGS = 0x0080;
Run Code Online (Sandbox Code Playgroud)
它似乎都具有相同的值.而且因为transient对方法没有任何意义,而varargs对于字段没有任何意义,它们可以是相同的.
但是,Modifier班级不考虑这一点是不行的.我提出了一个问题.它需要一个新的常量 - VARARGS一个新的方法 - isVarargs(..).并且toString()可以重写该方法以包括"transient/varargs".
这看起来像是实现中的错误.我认为根本原因可能是.class文件中为瞬态字段设置的位对于varargs方法是相同的(请参阅http://java.sun.com/docs/books/jvms/second_edition/ClassFileFormat-Java5. pdf,第122和119页).
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |