有没有一种可行的方法来在Java中加载任何类时运行我自己的代码,而不强制用户显式地并用自定义类加载器手动加载所有类?
无需过多细节,每当实现某个接口的类读取其注释将其与另一个类链接,并将该对赋予第三个类时.
编辑:哎呀,我会详细说明:我正在做一个事件处理库.我正在做的是让客户端代码执行他们自己的侦听器/事件对,这需要作为一对在我的库中注册.(嗯,毕竟不是那么久).
进一步编辑:目前客户端代码需要手动注册这对类/接口,这非常有效.我的意图是将其自动化,我认为将两个类与注释联系起来会有所帮助.接下来,我想摆脱需要始终保持注册列表最新的客户端代码.
PS:静态块不会,因为我的接口被捆绑到一个库中,客户端代码将创建更多的接口.因此,抽象类也不会这样做,因为它必须是一个接口.
我使用Reflections库开发了一个应用程序,用于查询具有特定注释的所有类.在我决定从我的应用程序创建一个Eclipse插件之前,一切都像魅力一样.然后,思考停止工作.
鉴于我的应用程序在不是Eclipse插件的一部分时工作正常,我认为它应该是一个类加载器问题.所以我在我Reflections的类中添加了插件激活器类的类加载器,上下文类加载器以及我能想象的所有其他类加载器,没有任何成功.这是我的代码的简化版本:
ConfigurationBuilder config = new ConfigurationBuilder();
config.addClassLoaders(thePluginActivatorClassLoader);
config.addClassLoaders(ClasspathHelper.getContextClassLoader());
config.addClassLoaders("all the classloaders I could imagine");
config.filterInputsBy(new FilterBuilder().include("package I want to analyze"));
Reflections reflections = new Reflections(config);
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(MyAnnotation.class); //this Set is empty
Run Code Online (Sandbox Code Playgroud)
我也尝试添加我想要加载到ConfigurationBuilder类的类的URL ,但它没有帮助.
有人能告诉我是否有办法让Reflections工作成为Eclipse插件的一部分?或者我应该更好地寻找另一种替代方案?非常感谢,我真的很困惑.
我需要一个包含在我的Java源代码包中的所有类文件的Class [].
我找不到一个标准的方法来一次性完成它.如果有人可以编写一个函数来获取该列表将非常有用.
Class[] myClasses = yourfunction(); // Return a list of class inside a source package in the currently working project in java
Run Code Online (Sandbox Code Playgroud) 有没有办法循环(例如,通过)所有类在一些包中?
我必须addAnnotatedClass(Class c)上AnnotationConfiguration.这样做:
AnnotationConfiguration annotationConfiguration.addAnnotatedClass(AdditionalInformation.class);
annotationConfiguration.addAnnotatedClass(AdditionalInformationGroup.class);
annotationConfiguration.addAnnotatedClass(Address.class);
annotationConfiguration.addAnnotatedClass(BankAccount.class);
annotationConfiguration.addAnnotatedClass(City.class);
//et cetera
Run Code Online (Sandbox Code Playgroud)
我的所有桌子都是包装好的Tables.Informations.
我想获得一个在运行时可用且与简单名称匹配的类列表.
例如:
public List<String> getFQNs(String simpleName) {
...
}
// Would return ["java.awt.List","java.util.List"]
List<String> fqns = getFQNs("List")
Run Code Online (Sandbox Code Playgroud)
是否有一个可以有效地执行此操作的库,或者我是否必须手动遍历每个类加载器中的所有类?这样做的正确方法是什么?
谢谢!
UPDATE
一位回答者问我为什么要这样做.本质上,我想实现一个类似于"组织导入/自动导入"的功能,但在运行时可用.我不介意解决方案是否相对较慢(特别是如果我可以构建一个缓存,以便后续查询变得更快),如果它只是最好的努力.例如,我不介意我是否得到动态生成的类.
更新2
我必须设计自己的解决方案(见下文):它使用其他响应者提供的一些提示,但我开始意识到它需要可扩展以处理各种环境.无法在运行时自动遍历所有类加载器,因此您必须依赖常规和特定于域的策略来获取有用的类列表.
我有一个应用程序,允许使用抽象类,人们编写自己的实现.我从目录中将这些实现加载为.class-files.目前,我有这个解决方案:
File classDir = new File("/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
如您所见 - 我需要指定类所在的包,以便正确加载它们.省略了包裹,我得到了一个
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
Run Code Online (Sandbox Code Playgroud)
错误.
现在,从建筑POV来看,我认为设计其他人的类在加载时必须编译为MY包,这是非常糟糕的设计.
所以我问你:有没有办法从文件系统加载类而不必指定它们所在的包?
我看过帖子:
查看.jar文件的内容
以及
如何列出JAR文件中的文件?
但遗憾的是,我找不到一个好的解决方案来实际读取 JAR的内容(逐个文件).
此外,有人可以给我一个提示,或指向一个资源,我的问题在哪里讨论?
我只能想到一个不那么直接的方法来做到这一点:
我可以以某种方式将JAR资源列表转换为内部JAR URL列表,然后我可以使用openConnection()打开它.
我正在尝试扫描我的webapplication类路径以查找所有涉及某些界面的类.
我当前的应用程序在独立版本中运行良好,但在Web环境中失败.
这是我的代码的一部分
public String[] getClassPathRoots() {
String classPath;
classPath = System.getProperty("java.class.path");
}
String[] pathElements = classPath.split(File.pathSeparator);
return pathElements;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何java.class.path在我的应用程序中使用,所以我应该能够获得类路径根.
java ×8
classloader ×4
reflection ×2
api ×1
class ×1
eclipse ×1
hibernate ×1
jar ×1
java-ee ×1