java获取类包的名称

标签 java spring logging packages classname

我有一堆小服务,方便地称为微服务 ;-),它们都具有相同的启动行为。它们被安排在包裹中 - 每一种服务。包命名是这样的:

com.foo.bar.Application

其中 com.foo 是域部分, bar 是实际的服务名称, Application 是我的主要实例类和 main 方法。

现在我想做的是在它们启动时打印出标准化的日志消息,显示用户可能查询的 URL 以获取有关服务的一些信息。根据定义,获取服务信息的 URL 应构造如下:
   IP:PORT/bar/admin/info 

我试图用 getClass()... 等来获取这个 bar.name,但这不起作用。所以我试过这个:
LOG.info("Access URLs:\n----------------------------------------------------------\n" +
            "\tLocal: \t\thttp://127.0.0.1:{}/" + getMyClass() + "/info\n" +
            "\tExternal: \thttp://{}:{}/" + getMyClass() + "/info\n----------------------------------------------------------",
                env.getProperty("server.port"),
                InetAddress.getLocalHost().getHostAddress(),
                env.getProperty("server.port")
        );

 /**
     * Get the name of the application class as a static value, so we can show it in the log
     */
    public static final Class[] getClassContext() {
        return new SecurityManager() {
            protected Class[] getClassContext(){return super.getClassContext();}
        }.getClassContext();
    };
    public static final Class getMyClass() { return getClassContext()[2];}

但是正如您可能已经猜到的那样,这打印出来的太多了:
class com.foo.bar.Application

我想得到的地方是
bar

我怎样才能做到这一点???

顺便说一句,我正在使用 Java 8 和 Spring boot - 如果有帮助的话

此致,

克里斯

最佳答案

您可以尝试先从类中检索包对象,然后读取其名称。以下代码将在 packageName 中为您提供完整的包含包名称(例如“com.foo.bar”)。变量,以及 bar 中的直接父名称(例如 directParent )多变的:

    String packageName = getMyClass().getPackage().getName();

    String directParent;
    if(packageName.contains(".")) {
        directParent = packageName.substring(1 + packageName.lastIndexOf("."));
    } else {
        directParent = packageName;
    }

所以,如果你把它放在这个片段之后,你的日志语句可以只使用这些变量之一。

关于java获取类包的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37391098/

相关文章:

java - 如何单击 AutocompleteTextView 列表上的事件并查询 sqlite。(我有一个示例代码。)

spring - 在 Spring 中使用 ServletUriComponentsBuilder 构建没有端口号的 Url

python - logger.info 在 Django 日志记录中不起作用

java - 在哪里可以找到 log4j.properties 文件

java - 如何在 Google App Engine 中执行任务

java - Java 中的递归枚举

java - 时间戳响应不正确 - BouncyCaSTLe

java - Hibernate saveorupdate 或 merge 用于保存/更新一对多关系对象

java - 使用 spring 集成注释将多个 channel 发送到单个 channel

java - 用Java编写一个简单的打印方法用于调试