程序包 org.bukkit.plugin

# 类 PluginDescriptionFile

java.lang.Object
org.bukkit.plugin.PluginDescriptionFile

public final class PluginDescriptionFile extends Object
这个类是用于储存插件plugin.yml内的数据. 所有的插件都必须有自己的plugin.yml.对于插件来说 plguin.yml是必须使用的标准 这个文件必须位于jar的根目录下.

当Bukkit加载插件时,它必须知道一些基础的关于这个插件的信息. Bukkit从plugin.yml读取数据. plugin.yml由一组属性构成,每个属性位于单独的一行并且没有缩进.

每一个方法(几乎每一个) 都在plugin.yml有其对应的条目. 下面是每一个插件所需的条目.

- `getName()` - `name`
- `getVersion()` - `version`
- `getMain()` - `main`

未能填写以上条目,将导致一个异常并且使Bukkit忽视你的插件.

下面是plugin.yml可能拥有的条目表格,具体细节包括各自的方法:

The description of the plugin.yml layout
条目 | 方法 | 概要
--- | --- | ---
`name` | `getName()` | 该插件的名字
`provides` | `getProvides()` | The plugin APIs which this plugin provides
`version` | `getVersion()` | 插件的版本
`main` | `getMain()` | 插件主类的位置
`author` `authors` | `getAuthors()` | 插件的作者们
`contributors` | `getContributors()` | 插件的贡献者们
`description` | `getDescription()` | 可读的插件描述
`website` | `getWebsite()` | 插件的网址
`prefix` | `getPrefix()` | 用于控制台的插件前缀
`load` | `getLoad()` | 载入插件的时机
`depend` | `getDepend()` | 必须的前置插件
`softdepend` | `getSoftDepend()` | 非必须的前置插件
`loadbefore` | `getLoadBefore()` | 反softdepend,可理解为在某些插件前加载
`commands` | `getCommands()` | 插件将被注册的命令
`permissions` | `getPermissions()` | 插件将被注册的权限
`default-permission` | `getPermissionDefault()` | 插件将注册的基本的`default` 权限 `permissions`
`awareness` | `getAwareness()` | 插件的概念
`api-version` | `getAPIVersion()` | 开发插件时针对的API版本
`libraries` | `()` | 插件使用到的类库

一个plugin.yml的例子:

>     name: Inferno
>     provides: [Hell]
>     version: 1.4.1
>     description: This plugin is so 31337. You can set yourself on fire.
>     # We could place every author in the authors list, but chose not to for illustrative purposes
>     # Also, having an author distinguishes that person as the project lead, and ensures their
>     # name is displayed first
>     author: CaptainInflamo
>     authors: [Cogito, verrier, EvilSeph]
>     contributors: [Choco, md_5]
>     website: http://www.curse.com/server-mods/minecraft/myplugin

>     main: com.captaininflamo.bukkit.inferno.Inferno
>     depend: [NewFire, FlameWire]
>     api-version: 1.13
>     libraries:
>         - com.squareup.okhttp3:okhttp:4.9.0

>     commands:
>       flagrate:
>         description: Set yourself on fire.
>         aliases: [combust_me, combustMe]
>         permission: inferno.flagrate
>         usage: Syntax error! Simply type /<command> to ignite yourself.
>       burningdeaths:
>         description: List how many times you have died by fire.
>         aliases: [burning_deaths, burningDeaths]
>         permission: inferno.burningdeaths
>         usage: |
>           /<command> [player]
>           Example: /<command> - see how many times you have burned to death
>           Example: /<command> CaptainIce - see how many times CaptainIce has burned to death

>     permissions:
>       inferno.*:
>         description: Gives access to all Inferno commands
>         children:
>           inferno.flagrate: true
>           inferno.burningdeaths: true
>           inferno.burningdeaths.others: true
>       inferno.flagrate:
>         description: Allows you to ignite yourself
>         default: true
>       inferno.burningdeaths:
>         description: Allows you to see how many times you have burned to death
>         default: true
>       inferno.burningdeaths.others:
>         description: Allows you to see how many times others have burned to death
>         default: op
>         children:
>           inferno.burningdeaths: true

- ## 构造器概要

  构造器
  构造器
  说明
  `PluginDescriptionFile(@NotNull InputStream stream)`
  `PluginDescriptionFile(@NotNull Reader reader)`
  从指定的Reader中读取PluginDescriptionFile.
  `PluginDescriptionFile(@NotNull String pluginName, @NotNull String pluginVersion, @NotNull String mainClass)`
  构造一个新的PluginDescriptionFile.

- ## 方法概要

  修饰符和类型
  方法
  说明
  `@Nullable String`
  `getAPIVersion()`
  Gives the API version which this plugin is designed to support.
  `@NotNull List<String>`
  `getAuthors()`
  Gives the list of authors for the plugin.
  `@NotNull Set<PluginAwareness>`
  `getAwareness()`
  Gives a set of every `PluginAwareness` for a plugin.
  `@Nullable String`
  `getClassLoaderOf()`
  已过时。
  unused
  `@NotNull Map<String,Map<String,Object>>`
  `getCommands()`
  Gives the map of command-name to command-properties.
  `@NotNull List<String>`
  `getContributors()`
  Gives the list of contributors for the plugin.
  `@NotNull List<String>`
  `getDepend()`
  Gives a list of other plugins that the plugin requires.
  `@Nullable String`
  `getDescription()`
  Gives a human-friendly description of the functionality the plugin provides.
  `@NotNull String`
  `getFullName()`
  Returns the name of a plugin, including the version.
  `@NotNull List<String>`
  `getLibraries()`
  Gets the libraries this plugin requires.
  `@NotNull PluginLoadOrder`
  `getLoad()`
  Gives the phase of server startup that the plugin should be loaded.
  `@NotNull List<String>`
  `getLoadBefore()`
  Gets the list of plugins that should consider this plugin a soft-dependency.
  `@NotNull String`
  `getMain()`
  Gives the fully qualified name of the main class for a plugin.
  `@NotNull String`
  `getName()`
  Gives the name of the plugin.
  `@NotNull PermissionDefault`
  `getPermissionDefault()`
  Gives the default `default` state of `permissions` registered for the plugin.
  `@NotNull List<Permission>`
  `getPermissions()`
  Gives the list of permissions the plugin will register at runtime, immediately proceding enabling.
  `@Nullable String`
  `getPrefix()`
  Gives the token to prefix plugin-specific logging messages with.
  `@NotNull List<String>`
  `getProvides()`
  Gives the list of other plugin APIs which this plugin provides.
  `@NotNull String`
  `getRawName()`
  `@NotNull List<String>`
  `getSoftDepend()`
  Gives a list of other plugins that the plugin requires for full functionality.
  `@NotNull String`
  `getVersion()`
  Gives the version of the plugin.
  `@Nullable String`
  `getWebsite()`
  Gives the plugin's or plugin's author's website.
  `void`
  `save(@NotNull Writer writer)`
  Saves this PluginDescriptionFile to the given writer

  ### 从类继承的方法 java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## 构造器详细资料

  - ### PluginDescriptionFile

    public PluginDescriptionFile(@NotNull @NotNull InputStream stream) throws InvalidDescriptionException
    抛出:
      `InvalidDescriptionException`

  - ### PluginDescriptionFile

    public PluginDescriptionFile(@NotNull @NotNull Reader reader) throws InvalidDescriptionException
    从指定的Reader中读取PluginDescriptionFile.

    原文:Loads a PluginDescriptionFile from the specified reader

    参数:
      `reader` - Reader对象
    抛出:
      `InvalidDescriptionException` - 如果PluginDescriptionFile是无效的

  - ### PluginDescriptionFile

    public PluginDescriptionFile(@NotNull @NotNull String pluginName, @NotNull @NotNull String pluginVersion, @NotNull @NotNull String mainClass)
    构造一个新的PluginDescriptionFile.

    原文:Creates a new PluginDescriptionFile with the given detailed

    参数:
      `pluginName` - 插件名称
      `pluginVersion` - 插件版本
      `mainClass` - 插件主类的完整路径

- ## 方法详细资料

  - ### getName

    @NotNull public @NotNull String getName()
    Gives the name of the plugin. This name is a unique identifier for plugins.
    - Must consist of all alphanumeric characters, underscores, hyphon, and period (a-z,A-Z,0-9, _.-). Any other character will cause the plugin.yml to fail loading.
    - Used to determine the name of the plugin's data folder. Data folders are placed in the ./plugins/ directory by default, but this behavior should not be relied on. `Plugin.getDataFolder()` should be used to reference the data folder.
    - It is good practice to name your jar the same as this, for example 'MyPlugin.jar'.
    - Case sensitive.
    - The is the token referenced in `getDepend()`, `getSoftDepend()`, and `getLoadBefore()`.
    - Using spaces in the plugin's name is deprecated.

    In the plugin.yml, this entry is named `name`.

    Example:

    >     name: MyPlugin

    返回:
      the name of the plugin

  - ### getProvides

    @NotNull public @NotNull List<String> getProvides()
    Gives the list of other plugin APIs which this plugin provides. These are usable for other plugins to depend on.
    - Must consist of all alphanumeric characters, underscores, hyphon, and period (a-z,A-Z,0-9, _.-). Any other character will cause the plugin.yml to fail loading.
    - A different plugin providing the same one or using it as their name will not result in the plugin to fail loading.
    - Case sensitive.
    - An entry of this list can be referenced in `getDepend()`, `getSoftDepend()`, and `getLoadBefore()`.
    - `provides` must be in YAML list format.

    In the plugin.yml, this entry is named `provides`.

    Example:

    >     provides:
    >     - OtherPluginName
    >     - OldPluginName

    返回:
      immutable list of the plugin APIs which this plugin provides

  - ### getVersion

    @NotNull public @NotNull String getVersion()
    Gives the version of the plugin.
    - Version is an arbitrary string, however the most common format is MajorRelease.MinorRelease.Build (eg: 1.4.1).
    - Typically you will increment this every time you release a new feature or bug fix.
    - Displayed when a user types `/version PluginName`

    In the plugin.yml, this entry is named `version`.

    Example:

    >     version: 1.4.1

    返回:
      the version of the plugin

  - ### getMain

    @NotNull public @NotNull String getMain()
    Gives the fully qualified name of the main class for a plugin. The format should follow the `ClassLoader.loadClass(String)` syntax to successfully be resolved at runtime. For most plugins, this is the class that extends `JavaPlugin`.
    - This must contain the full namespace including the class file itself.
    - If your namespace is `org.bukkit.plugin`, and your class file is called `MyPlugin` then this must be `org.bukkit.plugin.MyPlugin`
    - No plugin can use `org.bukkit.` as a base package for any class, including the main class.

    In the plugin.yml, this entry is named `main`.

    Example:

    >     main: org.bukkit.plugin.MyPlugin

    返回:
      the fully qualified main class for the plugin

  - ### getDescription

    @Nullable public @Nullable String getDescription()
    Gives a human-friendly description of the functionality the plugin provides.
    - The description can have multiple lines.
    - Displayed when a user types `/version PluginName`

    In the plugin.yml, this entry is named `description`.

    Example:

    >     description: This plugin is so 31337. You can set yourself on fire.

    返回:
      description of this plugin, or null if not specified

  - ### getLoad

    @NotNull public @NotNull PluginLoadOrder getLoad()
    Gives the phase of server startup that the plugin should be loaded.
    - Possible values are in `PluginLoadOrder`.
    - Defaults to `PluginLoadOrder.POSTWORLD`.
    - Certain caveats apply to each phase.
    - When different, `getDepend()`, `getSoftDepend()`, and `getLoadBefore()` become relative in order loaded per-phase. If a plugin loads at `STARTUP`, but a dependency loads at `POSTWORLD`, the dependency will not be loaded before the plugin is loaded.

    In the plugin.yml, this entry is named `load`.

    Example:

    >     load: STARTUP

    返回:
      the phase when the plugin should be loaded

  - ### getAuthors

    @NotNull public @NotNull List<String> getAuthors()
    Gives the list of authors for the plugin.
    - Gives credit to the developer.
    - Used in some server error messages to provide helpful feedback on who to contact when an error occurs.
    - A SpigotMC forum handle or email address is recommended.
    - Is displayed when a user types `/version PluginName`
    - `authors` must be in YAML list format.

    In the plugin.yml, this has two entries, `author` and `authors`.

    Single author example:

    >     author: CaptainInflamo

    Multiple author example:

    >     authors: [Cogito, verrier, EvilSeph]

    When both are specified, author will be the first entry in the list, so this example:

    >     author: Grum
    >     authors:
    >     - feildmaster
    >     - amaranth

    Is equivilant to this example:

        authors: [Grum, feildmaster, aramanth]

    返回:
      an immutable list of the plugin's authors

  - ### getContributors

    @NotNull public @NotNull List<String> getContributors()
    Gives the list of contributors for the plugin.
    - Gives credit to those that have contributed to the plugin, though not enough so to warrant authorship.
    - Unlike `getAuthors()`, contributors will not be mentioned in server error messages as a means of contact.
    - A SpigotMC forum handle or email address is recommended.
    - Is displayed when a user types `/version PluginName`
    - `contributors` must be in YAML list format.

    Example:

    >     authors: [Choco, md_5]

    返回:
      an immutable list of the plugin's contributors

  - ### getWebsite

    @Nullable public @Nullable String getWebsite()
    Gives the plugin's or plugin's author's website.
    - A link to the Curse page that includes documentation and downloads is highly recommended.
    - Displayed when a user types `/version PluginName`

    In the plugin.yml, this entry is named `website`.

    Example:

    >     website: http://www.curse.com/server-mods/minecraft/myplugin

    返回:
      description of this plugin, or null if not specified

  - ### getDepend

    @NotNull public @NotNull List<String> getDepend()
    Gives a list of other plugins that the plugin requires.
    - Use the value in the `getName()` of the target plugin to specify the dependency.
    - If any plugin listed here is not found, your plugin will fail to load at startup.
    - If multiple plugins list each other in `depend`, creating a network with no individual plugin does not list another plugin in the network, all plugins in that network will fail.
    - `depend` must be in YAML list format.

    In the plugin.yml, this entry is named `depend`.

    Example:

    >     depend:
    >     - OnePlugin
    >     - AnotherPlugin

    返回:
      immutable list of the plugin's dependencies

  - ### getSoftDepend

    @NotNull public @NotNull List<String> getSoftDepend()
    Gives a list of other plugins that the plugin requires for full functionality. The `PluginManager` will make best effort to treat all entries here as if they were a `dependency`, but will never fail because of one of these entries.
    - Use the value in the `getName()` of the target plugin to specify the dependency.
    - When an unresolvable plugin is listed, it will be ignored and does not affect load order.
    - When a circular dependency occurs (a network of plugins depending or soft-dependending each other), it will arbitrarily choose a plugin that can be resolved when ignoring soft-dependencies.
    - `softdepend` must be in YAML list format.

    In the plugin.yml, this entry is named `softdepend`.

    Example:

    >     softdepend: [OnePlugin, AnotherPlugin]

    返回:
      immutable list of the plugin's preferred dependencies

  - ### getLoadBefore

    @NotNull public @NotNull List<String> getLoadBefore()
    Gets the list of plugins that should consider this plugin a soft-dependency.
    - Use the value in the `getName()` of the target plugin to specify the dependency.
    - The plugin should load before any other plugins listed here.
    - Specifying another plugin here is strictly equivalent to having the specified plugin's `getSoftDepend()` include `this plugin`.
    - `loadbefore` must be in YAML list format.

    In the plugin.yml, this entry is named `loadbefore`.

    Example:

    >     loadbefore:
    >     - OnePlugin
    >     - AnotherPlugin

    返回:
      immutable list of plugins that should consider this plugin a soft-dependency

  - ### getPrefix

    @Nullable public @Nullable String getPrefix()
    Gives the token to prefix plugin-specific logging messages with.
    - This includes all messages using `Plugin.getLogger()`.
    - If not specified, the server uses the plugin's `name`.
    - This should clearly indicate what plugin is being logged.

    In the plugin.yml, this entry is named `prefix`.

    Example:

    >     prefix: ex-why-zee

    返回:
      the prefixed logging token, or null if not specified

  - ### getCommands

    @NotNull public @NotNull Map<String,Map<String,Object>> getCommands()
    Gives the map of command-name to command-properties. Each entry in this map corresponds to a single command and the respective values are the properties of the command. Each property, with the exception of aliases, can be defined at runtime using methods in `PluginCommand` and are defined here only as a convenience.

    The command section's description
    Node | Method | Type | Description | Example
    --- | --- | --- | --- | ---
    > `description` | `Command.setDescription(String)` | String | A user-friendly description for a command. It is useful for documentation purposes as well as in-game help. |
    >     description: Set yourself on fire
    > `aliases` | `Command.setAliases(List)` | String or List of strings | Alternative command names, with special usefulness for commands that are already registered. Aliases are not effective when defined at runtime, so the plugin description file is the only way to have them properly defined. Note: Command aliases may not have a colon in them. | Single alias format:
    >     aliases: combust_me
    > or multiple alias format:
    >     aliases: [combust_me, combustMe]
    > `permission` | `Command.setPermission(String)` | String | The name of the `Permission` required to use the command. A user without the permission will receive the specified message (see below), or a standard one if no specific message is defined. Without the permission node, no `CommandExecutor` or `PluginCommand.setTabCompleter(TabCompleter)` will be called. |
    >     permission: inferno.flagrate
    > `permission-message` | `Command.setPermissionMessage(String)` | String | Displayed to a player that attempts to use a command, but does not have the required permission. See `above`. <permission> is a macro that is replaced with the permission node required to use the command. Using empty quotes is a valid way to indicate nothing should be displayed to a player. |
    >     permission-message: You do not have /<permission>
    > `usage` | `Command.setUsage(String)` | String | This message is displayed to a player when the `PluginCommand.setExecutor(CommandExecutor)` returns false. <command> is a macro that is replaced the command issued. |
    >     usage: Syntax error! Perhaps you meant /<command> PlayerName?
    > It is worth noting that to use a colon in a yaml, like ``usage: Usage: /god [player]'`, you need to surround the message with double-quote:
    >     usage: "Usage: /god [player]"

    The commands are structured as a hiearchy of nested mappings. The primary (top-level, no intendentation) node is ``commands`', while each individual command name is indented, indicating it maps to some value (in our case, the properties of the table above).

    Here is an example bringing together the piecemeal examples above, as well as few more definitions:

    >     commands:
    >       flagrate:
    >         description: Set yourself on fire.
    >         aliases: [combust_me, combustMe]
    >         permission: inferno.flagrate
    >         permission-message: You do not have /<permission>
    >         usage: Syntax error! Perhaps you meant /<command> PlayerName?
    >       burningdeaths:
    >         description: List how many times you have died by fire.
    >         aliases:
    >         - burning_deaths
    >         - burningDeaths
    >         permission: inferno.burningdeaths
    >         usage: |
    >           /<command> [player]
    >           Example: /<command> - see how many times you have burned to death
    >           Example: /<command> CaptainIce - see how many times CaptainIce has burned to death
    >       # The next command has no description, aliases, etc. defined, but is still valid
    >       # Having an empty declaration is useful for defining the description, permission, and messages from a configuration dynamically
    >       apocalypse:

    Note: Command names may not have a colon in their name.
    返回:
      the commands this plugin will register

  - ### getPermissions

    @NotNull public @NotNull List<Permission> getPermissions()
    Gives the list of permissions the plugin will register at runtime, immediately proceding enabling. The format for defining permissions is a map from permission name to properties. To represent a map without any specific property, empty curly-braces ( `{}` ) may be used (as a null value is not accepted, unlike the `commands` above).

    A list of optional properties for permissions:

    The permission section's description
    Node | Description | Example
    --- | --- | ---
    > `description` | Plaintext (user-friendly) description of what the permission is for. |
    >     description: Allows you to set yourself on fire
    > `default` | The default state for the permission, as defined by `Permission.getDefault()`. If not defined, it will be set to the value of `getPermissionDefault()`. For reference: `true` - Represents a positive assignment to `permissibles`. `false` - Represents no assignment to `permissibles`. `op` - Represents a positive assignment to `operator permissibles`. `notop` - Represents a positive assignment to `non-operator permissibiles`. |
    >     default: true
    > `children` | Allows other permissions to be set as a relation to the parent permission. When a parent permissions is assigned, child permissions are respectively assigned as well. When a parent permission is assigned negatively, child permissions are assigned based on an inversion of their association. When a parent permission is assigned positively, child permissions are assigned based on their association. Child permissions may be defined in a number of ways: Children may be defined as a list of names. Using a list will treat all children associated positively to their parent. Children may be defined as a map. Each permission name maps to either a boolean (representing the association), or a nested permission definition (just as another permission). Using a nested definition treats the child as a positive association. A nested permission definition must be a map of these same properties. To define a valid nested permission without defining any specific property, empty curly-braces ( `{}` ) must be used. A nested permission may carry it's own nested permissions as children, as they may also have nested permissions, and so forth. There is no direct limit to how deep the permission tree is defined. | As a list:
    >     children: [inferno.flagrate, inferno.burningdeaths]
    > Or as a mapping:
    >     children:
    >       inferno.flagrate: true
    >       inferno.burningdeaths: true
    An additional example showing basic nested values can be seen here.

    The permissions are structured as a hiearchy of nested mappings. The primary (top-level, no intendentation) node is ``permissions`', while each individual permission name is indented, indicating it maps to some value (in our case, the properties of the table above).

    Here is an example using some of the properties:

    >     permissions:
    >       inferno.*:
    >         description: Gives access to all Inferno commands
    >         children:
    >           inferno.flagrate: true
    >           inferno.burningdeaths: true
    >       inferno.flagate:
    >         description: Allows you to ignite yourself
    >         default: true
    >       inferno.burningdeaths:
    >         description: Allows you to see how many times you have burned to death
    >         default: true

    Another example, with nested definitions, can be found here.
    返回:
      the permissions this plugin will register

  - ### getPermissionDefault

    @NotNull public @NotNull PermissionDefault getPermissionDefault()
    Gives the default `default` state of `permissions` registered for the plugin.
    - If not specified, it will be `PermissionDefault.OP`.
    - It is matched using `PermissionDefault.getByName(String)`
    - It only affects permissions that do not define the `default` node.
    - It may be any value in `PermissionDefault`.

    In the plugin.yml, this entry is named `default-permission`.

    Example:

    >     default-permission: NOT_OP

    返回:
      the default value for the plugin's permissions

  - ### getAwareness

    @NotNull public @NotNull Set<PluginAwareness> getAwareness()
    Gives a set of every `PluginAwareness` for a plugin. An awareness dictates something that a plugin developer acknowledges when the plugin is compiled. Some implementions may define extra awarenesses that are not included in the API. Any unrecognized awareness (one unsupported or in a future version) will cause a dummy object to be created instead of failing.
    - Currently only supports the enumerated values in `PluginAwareness.Flags`.
    - Each awareness starts the identifier with bang-at (`!@`).
    - Unrecognized (future / unimplemented) entries are quietly replaced by a generic object that implements PluginAwareness.
    - A type of awareness must be defined by the runtime and acknowledged by the API, effectively discluding any derived type from any plugin's classpath.
    - `awareness` must be in YAML list format.

    In the plugin.yml, this entry is named `awareness`.

    Example:

    >     awareness:
    >     - !@UTF8

    Note: Although unknown versions of some future awareness are gracefully substituted, previous versions of Bukkit (ones prior to the first implementation of awareness) will fail to load a plugin that defines any awareness.

    返回:
      a set containing every awareness for the plugin

  - ### getFullName

    @NotNull public @NotNull String getFullName()
    Returns the name of a plugin, including the version. This method is provided for convenience; it uses the `getName()` and `getVersion()` entries.
    返回:
      a descriptive name of the plugin and respective version

  - ### getAPIVersion

    @Nullable public @Nullable String getAPIVersion()
    Gives the API version which this plugin is designed to support. No specific format is guaranteed.
    - Refer to release notes for supported API versions.

    In the plugin.yml, this entry is named `api-version`.

    Example:

    >     api-version: 1.13

    返回:
      the version of the plugin

  - ### getLibraries

    @NotNull public @NotNull List<String> getLibraries()
    Gets the libraries this plugin requires. This is a preview feature.
    - Libraries must be GAV specifiers and are loaded from Maven Central.

    Example:

    >     libraries:
    >          - com.squareup.okhttp3:okhttp:4.9.0

    返回:
      required libraries

  - ### getClassLoaderOf

    @Deprecated @Nullable public @Nullable String getClassLoaderOf()
    已过时。
    unused
    返回:
      unused

  - ### save

    public void save(@NotNull @NotNull Writer writer)
    Saves this PluginDescriptionFile to the given writer
    参数:
      `writer` - Writer to output this file to

  - ### getRawName

    @Internal @NotNull public @NotNull String getRawName()
    返回:
      internal use