Access.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright (c) 1997 Per M.A. Bothner.
  2. // This is free software; for terms and warranty disclaimer see ./COPYING.
  3. package gnu.bytecode;
  4. /** Access flags. */
  5. /* When using JDK 1.1, replace this class by java.lang.reflec.Modifiers. */
  6. public class Access {
  7. static public final short PUBLIC = 0x0001;
  8. static public final short PRIVATE = 0x0002;
  9. static public final short PROTECTED = 0x0004;
  10. static public final short STATIC = 0x0008;
  11. static public final short FINAL = 0x0010;
  12. static public final short SUPER = 0x0020;
  13. static public final short SYNCHRONIZED= 0x0020;
  14. static public final short VOLATILE = 0x0040;
  15. static public final short BRIDGE = 0x0040;
  16. static public final short TRANSIENT = 0x0080;
  17. static public final short VARARGS = 0x0080;
  18. static public final short NATIVE = 0x0100;
  19. static public final short INTERFACE = 0x0200;
  20. static public final short ABSTRACT = 0x0400;
  21. static public final short STRICT = 0x0800;
  22. static public final short SYNTHETIC = 0x1000;
  23. static public final short ANNOTATION = 0x2000;
  24. static public final short ENUM = 0x4000;
  25. // unassigned 0x8000
  26. /** Value for {@code toString}'s {@code kind} parameter when decoding
  27. * a class's access flags. */
  28. public static final char CLASS_CONTEXT = 'C';
  29. /** Value for {@code toString}'s {@code kind} parameter when decoding
  30. * access flags in {@code InnerClasses} attribute. */
  31. public static final char INNERCLASS_CONTEXT = 'I';
  32. /** Value for {@code toString}'s {@code kind} parameter when decoding
  33. * a field's access flags. */
  34. public static final char FIELD_CONTEXT = 'F';
  35. /** Value for {@code toString}'s {@code kind} parameter when decoding
  36. * a methods's access flags. */
  37. public static final char METHOD_CONTEXT = 'M';
  38. /** Mask of access flags valid for a class. */
  39. public static final short CLASS_MODIFIERS
  40. = (short)(PUBLIC|FINAL|SUPER|INTERFACE|ABSTRACT|SYNTHETIC|ANNOTATION|ENUM);
  41. /** Mask of access flags valid in an {@code InnerClasses} attribute. */
  42. public static final short INNERCLASS_MODIFIERS
  43. = (short)(PUBLIC|PRIVATE|PROTECTED|STATIC|FINAL|INTERFACE|ABSTRACT|SYNTHETIC|ANNOTATION|ENUM);
  44. /** Mask of access flags valid for a field. */
  45. public static final short FIELD_MODIFIERS
  46. = (short)(PUBLIC|PRIVATE|PROTECTED|STATIC|FINAL
  47. |VOLATILE|TRANSIENT|SYNTHETIC|ENUM);
  48. /** Mask of access flags valid for a method. */
  49. public static final short METHOD_MODIFIERS
  50. = (short)(PUBLIC|PRIVATE|PROTECTED|STATIC|FINAL|SYNCHRONIZED
  51. |BRIDGE|VARARGS|NATIVE|ABSTRACT|STRICT|SYNTHETIC);
  52. public static String toString(int flags)
  53. {
  54. return toString(flags, '\0');
  55. }
  56. /** Return a string naming the access bits in flags.
  57. * @param kind {@code CLASS_CONTEXT} for a class,
  58. * {@code METHOD_CONTEXT} for a method,
  59. * {@code FIELD_CONTEXT} for a field,
  60. * {@code INNERCLASS_CONTEXT} in an {@code InnerClasses} attribute.
  61. */
  62. public static String toString(int flags, char kind)
  63. {
  64. short mask
  65. = (kind == CLASS_CONTEXT ? CLASS_MODIFIERS
  66. : kind == INNERCLASS_CONTEXT ? INNERCLASS_MODIFIERS
  67. : kind == FIELD_CONTEXT ? FIELD_MODIFIERS
  68. : kind == METHOD_CONTEXT ? METHOD_MODIFIERS
  69. : (CLASS_MODIFIERS|FIELD_MODIFIERS|METHOD_MODIFIERS));
  70. short bad_flags = (short) (flags & ~mask);
  71. flags &= mask;
  72. StringBuffer buf = new StringBuffer();
  73. if ((flags & PUBLIC) != 0) buf.append(" public");
  74. if ((flags & PRIVATE) != 0) buf.append(" private");
  75. if ((flags & PROTECTED) != 0) buf.append(" protected");
  76. if ((flags & STATIC) != 0) buf.append(" static");
  77. if ((flags & FINAL) != 0) buf.append(" final");
  78. if ((flags & SYNCHRONIZED) != 0)
  79. buf.append(kind == 'C' ? " super" : " synchronized");
  80. if ((flags & VOLATILE) != 0)
  81. buf.append(kind == 'M' ? " bridge" : " volatile");
  82. if ((flags & TRANSIENT) != 0)
  83. buf.append(kind == 'M' ? " varargs" : " transient");
  84. if ((flags & NATIVE) != 0) buf.append(" native");
  85. if ((flags & INTERFACE) != 0) buf.append(" interface");
  86. if ((flags & ABSTRACT) != 0) buf.append(" abstract");
  87. if ((flags & STRICT) != 0) buf.append(" strict");
  88. if ((flags & ENUM) != 0) buf.append(" enum");
  89. if ((flags & SYNTHETIC) != 0) buf.append(" synthetic");
  90. if ((flags & ANNOTATION) != 0) buf.append(" annotation");
  91. if (bad_flags != 0)
  92. {
  93. buf.append(" unknown-flags:0x");
  94. buf.append(Integer.toHexString(bad_flags));
  95. }
  96. return buf.toString();
  97. }
  98. }