java获取类包的名称

硅克里斯

我有一堆小服务,通常称为Microservices ;-),它们都有相同的启动行为。它们被安排在包装中-每个包装用于一项服务。软件包命名如下:

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启动-如果有帮助

最好的祝福,

克里斯

ernest_k

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

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

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

因此,如果将您的日志语句放在此代码段之后,则只能使用这些变量之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章