< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/JavaField.java

Print this page




   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.meta;
  24 
  25 import java.util.*;

  26 
  27 /**
  28  * Represents a reference to a Java field, either resolved or unresolved fields. Fields, like
  29  * methods and types, are resolved through {@link ConstantPool constant pools}.
  30  */
  31 public interface JavaField extends TrustedInterface {
  32 
  33     /**
  34      * Returns the name of this field.
  35      */
  36     String getName();
  37 
  38     /**
  39      * Returns a {@link JavaType} object that identifies the declared type for this field.
  40      */
  41     JavaType getType();
  42 
  43     /**
  44      * Returns the kind of this field. This is the same as calling {@link #getType}.
  45      * {@link JavaType#getJavaKind getJavaKind}.


  60      * specifiers that denote an attribute of this field that is to be copied to the result. A
  61      * specifier is a single character preceded by a '%' character. The accepted specifiers and the
  62      * field attributes they denote are described below:
  63      *
  64      * <pre>
  65      *     Specifier | Description                                          | Example(s)
  66      *     ----------+------------------------------------------------------------------------------------------
  67      *     'T'       | Qualified type                                       | "int" "java.lang.String"
  68      *     't'       | Unqualified type                                     | "int" "String"
  69      *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
  70      *     'h'       | Unqualified holder                                   | "Entry"
  71      *     'n'       | Field name                                           | "age"
  72      *     'f'       | Indicator if field is unresolved, static or instance | "unresolved" "static" "instance"
  73      *     '%'       | A '%' character                                      | "%"
  74      * </pre>
  75      *
  76      * @param format a format specification
  77      * @return the result of formatting this field according to {@code format}
  78      * @throws IllegalFormatException if an illegal specifier is encountered in {@code format}
  79      */
  80     @SuppressWarnings("fallthrough")
  81     default String format(String format) throws IllegalFormatException {
  82         StringBuilder sb = new StringBuilder();
  83         int index = 0;
  84         JavaType type = getType();
  85         while (index < format.length()) {
  86             char ch = format.charAt(index++);
  87             if (ch == '%') {
  88                 if (index >= format.length()) {
  89                     throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a field format specification");
  90                 }
  91                 char specifier = format.charAt(index++);
  92                 switch (specifier) {
  93                     case 'T':
  94                     case 't': {
  95                         sb.append(type.toJavaName(specifier == 'T'));
  96                         break;
  97                     }
  98                     case 'H':
  99                     case 'h': {
 100                         sb.append(getDeclaringClass().toJavaName(specifier == 'H'));




   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.meta;
  24 
  25 import java.util.IllegalFormatException;
  26 import java.util.UnknownFormatConversionException;
  27 
  28 /**
  29  * Represents a reference to a Java field, either resolved or unresolved fields. Fields, like
  30  * methods and types, are resolved through {@link ConstantPool constant pools}.
  31  */
  32 public interface JavaField extends TrustedInterface {
  33 
  34     /**
  35      * Returns the name of this field.
  36      */
  37     String getName();
  38 
  39     /**
  40      * Returns a {@link JavaType} object that identifies the declared type for this field.
  41      */
  42     JavaType getType();
  43 
  44     /**
  45      * Returns the kind of this field. This is the same as calling {@link #getType}.
  46      * {@link JavaType#getJavaKind getJavaKind}.


  61      * specifiers that denote an attribute of this field that is to be copied to the result. A
  62      * specifier is a single character preceded by a '%' character. The accepted specifiers and the
  63      * field attributes they denote are described below:
  64      *
  65      * <pre>
  66      *     Specifier | Description                                          | Example(s)
  67      *     ----------+------------------------------------------------------------------------------------------
  68      *     'T'       | Qualified type                                       | "int" "java.lang.String"
  69      *     't'       | Unqualified type                                     | "int" "String"
  70      *     'H'       | Qualified holder                                     | "java.util.Map.Entry"
  71      *     'h'       | Unqualified holder                                   | "Entry"
  72      *     'n'       | Field name                                           | "age"
  73      *     'f'       | Indicator if field is unresolved, static or instance | "unresolved" "static" "instance"
  74      *     '%'       | A '%' character                                      | "%"
  75      * </pre>
  76      *
  77      * @param format a format specification
  78      * @return the result of formatting this field according to {@code format}
  79      * @throws IllegalFormatException if an illegal specifier is encountered in {@code format}
  80      */

  81     default String format(String format) throws IllegalFormatException {
  82         StringBuilder sb = new StringBuilder();
  83         int index = 0;
  84         JavaType type = getType();
  85         while (index < format.length()) {
  86             char ch = format.charAt(index++);
  87             if (ch == '%') {
  88                 if (index >= format.length()) {
  89                     throw new UnknownFormatConversionException("An unquoted '%' character cannot terminate a field format specification");
  90                 }
  91                 char specifier = format.charAt(index++);
  92                 switch (specifier) {
  93                     case 'T':
  94                     case 't': {
  95                         sb.append(type.toJavaName(specifier == 'T'));
  96                         break;
  97                     }
  98                     case 'H':
  99                     case 'h': {
 100                         sb.append(getDeclaringClass().toJavaName(specifier == 'H'));


< prev index next >