我的代码如下所示。因为我告诉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);
}
答案 0 :(得分:1)
不确定它是否适合您但请尝试sun.reflect.Reflection.getCallerClass()。该类存在于JDK中。 它将返回方法调用者的Class实例。然后只是getPackage()。这是非常危险的东西,但它可以让你不直接使用类名。 示例用法 - 创建一个方法String getPackageName(),它将获取调用者类并返回包名称并从main调用它。
或者你可以抛出任何throwable,捕获它并解析throwable的堆栈跟踪以获取目标包名称(非常恶心)。
答案 1 :(得分:0)
答案 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();