java输出完全限定名_java – 从简单名称获取完全限定名称的列表

我混合了@Grodriguez和@bemace的答案,并添加了我自己的策略来提出尽力而为的解决方案.此解决方案在运行时模仿编译时可用的自动导入功能.

完整代码my solution is here.给出一个简单的名称,主要步骤是:

>获取可从当前类加载器访问的包列表.

>对于每个包,尝试加载从包简单名称获取的完全限定名称.

第2步很简单:

public List getFQNs(String simpleName) {

if (this.packages == null) {

this.packages = getPackages();

}

List fqns = new ArrayList();

for (String aPackage : packages) {

try {

String fqn = aPackage + "." + simpleName;

Class.forName(fqn);

fqns.add(fqn);

} catch (Exception e) {

// Ignore

}

}

return fqns;

}

第1步更难,取决于您的应用程序/环境,因此我实现了各种策略来获取不同的包列表.

当前类加载器(可能对检测动态生成的类很有用)

public Collection getPackages() {

Set packages = new HashSet();

for (Package aPackage : Package.getPackages()) {

packages.add(aPackage.getName());

}

return packages;

}

类路径(对于完全从类路径加载的应用程序来说已经足够了.不适用于像Eclipse这样的复杂应用程序)

public Collection getPackages() {

String classpath = System.getProperty("java.class.path");

return getPackageFromClassPath(classpath);

}

public static Set getPackageFromClassPath(String classpath) {

Set packages = new HashSet();

String[] paths = classpath.split(File.pathSeparator);

for (String path : paths) {

if (path.trim().length() == 0) {

continue;

} else {

File file = new File(path);

if (file.exists()) {

String childPath = file.getAbsolutePath();

if (childPath.endsWith(".jar")) {

packages.addAll(ClasspathPackageProvider

.readZipFile(childPath));

} else {

packages.addAll(ClasspathPackageProvider

.readDirectory(childPath));

}

}

}

}

return packages;

}

Bootstrap类路径(例如,java.lang)

public Collection getPackages() {

// Even IBM JDKs seem to use this property...

String classpath = System.getProperty("sun.boot.class.path");

return ClasspathPackageProvider.getPackageFromClassPath(classpath);

}

Eclipse捆绑包(特定于域的包提供程序)

// Don't forget to add "Eclipse-BuddyPolicy: global" to MANIFEST.MF

public Collection getPackages() {

Set packages = new HashSet();

BundleContext context = Activator.getDefault().getBundle()

.getBundleContext();

Bundle[] bundles = context.getBundles();

PackageAdmin pAdmin = getPackageAdmin(context);

for (Bundle bundle : bundles) {

ExportedPackage[] ePackages = pAdmin.getExportedPackages(bundle);

if (ePackages != null) {

for (ExportedPackage ePackage : ePackages) {

packages.add(ePackage.getName());

}

}

}

return packages;

}

public PackageAdmin getPackageAdmin(BundleContext context) {

ServiceTracker bundleTracker = null;

bundleTracker = new ServiceTracker(context,

PackageAdmin.class.getName(), null);

bundleTracker.open();

return (PackageAdmin) bundleTracker.getService();

}

Eclipse环境中的查询和答案示例:

>文件:[java.io.File,org.eclipse.core.internal.resources.File]>列表:[java.awt.List,org.eclipse.swt.widgets.List,com.sun.xml.internal.bind.v2.schemagen.xmlschema.List,java.util.List,org.hibernate.mapping.列表]> IResource:[org.eclipse.core.resources.IResource]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值