【问题标题】:classloader class.forName can load all the classes inside one package using .*classloader class.forName 可以使用 .* 加载一个包中的所有类
【发布时间】:2020-06-26 00:50:22
【问题描述】:

谢谢你帮助我

今天我有一个很简单的问题

问题:

在我的应用程序启动时,我正在使用

将所有类加载到一个包中
Class.forName("org.codehaus.jackson.JsonGenerator$Feature");
............................
............................ and so on

像这样我加载了所有的类,一切都很好,直到我升级了 Jar,所以 Jar 包被更新为其他包名,从 org.codehaus.jacksoncom.fasterxml.jackson。所以我必须更改class.forName 代码。

需要解决方案: 下面的代码是否可行

Class.forName("com.fasterxml.jackson.*");

或者还有其他方法可以将所有类加载到一个包下吗?

请帮忙:)

【问题讨论】:

  • 将这些类放在类路径中对您来说还不够吗?这对我来说听起来很奇怪。
  • 是的,我可以补充一下,这个设施是可用的
  • 您上面的代码完全没有任何用处,除非您有未使用的带有静态初始化程序的类或其他一些奇怪的架构。不清楚你在问什么。
  • 您的问题源于代码重复,可以使用通常的方法解决:String pkg = "org.codehaus.jackson."; Class.forName(pkg+"JsonGenerator"); Class.forName(pkg+"JsonGenerator$Feature"); Class.forName(pkg+ ..and..so..on..); 然后,您必须将"org.codehaus.jackson." 更改为"com.fasterxml.jackson."。这不影响其他人所说的,应该不需要这样的预加载。

标签: java jar classloader


【解决方案1】:

Class.forName("com.fasterxml.jackson.*");是不可能的,
docs很清楚,name参数应该是:

name - 所需类的完全限定名

此外,Class.forName 返回一个表示给定名称后面的类的单个对象。

您的问题是,如果您升级/更新 jar 文件,jackson 的包可以是org.codehaus.jacksoncom.fasterxml.jackson 之一。如果您想动态加载 jackson 类并且您不确定这些类的基本包是什么,这很奇怪。

但无论如何,如果给定的包名称包含所需的类(或至少其中几个,因此您会知道该包是可见的),则一种解决方案是使用反射进行扫描,如下所示:
@987654322 @
然后用类循环包,用Class.forName初始化它们。

【讨论】:

  • 这比这个问题更有意义。反射看不到尚未加载的类,如果已经加载,则无需执行任何其他操作。
猜你喜欢
  • 2023-04-03
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多