我想要动态的方式从java中的任何类获取包名称

时间:2013-09-27 06:27:26

标签: java

我的代码如下所示。因为我告诉class_name获取包名称。而不是这个方法,我需要另一个逻辑来获取包名称withoud直接告诉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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

类似的问题:

请参阅Can you find all classes in a package using reflection?

答案 2 :(得分:0)

我有两种方法。

  • 您可以为每个文件添加字段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();
    }
}

答案 3 :(得分:-1)

如果是静态方法。不。

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

如果它不是静态方法,

String name = this.getClass().getPackage().getName();