3

我有如下示例的代码。因为我告诉 class_name 获取包名。而不是这种方法,我需要另一个逻辑来获取包名而不直接告诉class_name。

package smk.jsf.bean;

public class test {
public static void main(String[] args) {
    System.out.println(test.class.getPackage().getName());
//Is there any option like "this.class.getPackage().getName();" bz. i don't want use class_name direclty

}

}

输出:smk.jsf.bean

谢谢大家。最后我得到了下面的解决方案

package smk.jsf.bean;

public class test {
public static void main(String[] args) {
String className = new Object(){}.getClass().getPackage().getName();        
System.out.println(className);

}
4

4 回答 4

1

不确定它是否适合您,但请尝试 sun.reflect.Reflection.getCallerClass()。这个类存在于 JDK 中。它将返回方法调用者的 Class 实例。然后只需 getPackage()。这真的很危险,但它让你不能直接使用类名。示例用法 - 创建一个方法 String getPackageName(),它将获取调用者类并返回包名并从 main 调用它。

或者你可以抛出任何 throwable,捕获它并解析 throwable 的堆栈跟踪以获取目标包名称(真的很恶心)。

于 2013-09-27T06:40:34.253 回答
1

我有两种方法。

  • public static final PACKAGE_INFO = "%package%";您可以为每个文件添加一个字段。然后遍历你的源目录,读取带有包的行package someName并替换%package%

  • 在运行时使用动态方法。我写了一个小示例程序。

public class PackageExample {

    public static void main(String[] args) throws ClassNotFoundException {
        Example e = new Example();
        System.out.println(e.getPackage());
    }

}

interface MetaInformation {
    public String getPackage() throws ClassNotFoundException;
}

class InformationGatherer implements MetaInformation {
    public String getPackage() throws ClassNotFoundException {
        StackTraceElement[] ste = new Exception().getStackTrace();
        if (ste.length < 2)
            throw new IllegalStateException("StackTrace to small to determine package!");
        String clazz = ste[1].getClassName();
        Class<?> c = Class.forName(clazz);
        String package_ = "";
        Package p = c.getPackage();
        if (p != null)
            package_ = c.getPackage().getName();
        return package_;
    }
}

class Example implements MetaInformation {
    private InformationGatherer ig = new InformationGatherer();

    public String getPackage() throws ClassNotFoundException {
        return ig.getPackage();
    }
}
于 2013-09-27T07:13:57.343 回答
0

不确定这是否有帮助,但您可以使用反射

http://docs.oracle.com/javase/tutorial/reflect/

类似的问题:

请参阅您可以使用反射找到包中的所有类吗?

于 2013-09-27T06:32:45.190 回答
-1

如果是静态方法。不。

您不能this 在静态上下文中使用,因为 main 是static方法。

如果不是静态方法,

String name = this.getClass().getPackage().getName();
于 2013-09-27T06:29:04.520 回答