有没有办法解决因两个相互引用的枚举导致的类加载问题?
我有两组枚举,Foo和Bar,定义如下:
public class EnumTest {
public enum Foo {
A(Bar.Alpha),
B(Bar.Delta),
C(Bar.Alpha);
private Foo(Bar b) {
this.b = b;
}
public final Bar b;
}
public enum Bar {
Alpha(Foo.A),
Beta(Foo.C),
Delta(Foo.C);
private Bar(Foo f) {
this.f = f;
}
public final Foo f;
}
public static void main (String[] args) {
for (Foo f: Foo.values()) {
System.out.println(f + " bar " + f.b);
}
for (Bar b: Bar.values()) {
System.out.println(b + " foo " + b.f);
}
} …Run Code Online (Sandbox Code Playgroud) 有没有办法确定在运行时从哪些jar加载哪些类?
我相信我们以前一直都在JAR地狱.我在项目上遇到了很多故障排除ClassNotFoundException和问题NoClassDefFoundError.我想避免在罐子里找到一个类的所有实例,并在代码上使用消除过程导致CNFE找到罪魁祸首.
是否有任何分析或管理工具可以为您提供此类信息?
这个问题非常烦人,因为我们应该在类加载时获得这些信息.必须有一种方法来达到它,或记录并找到它,但我知道什么都不会做到这一点,对吗?
我知道OSGi和版本化的软件包/模块旨在使这个问题成为一个问题......但它似乎不会很快消失.:)
注意:我发现这个问题是我的问题的一个子集,与从版本化的jar加载的类有关.
更新:有点相关,这篇文章解释了在jar中(在当前目录下)或在M2_REPO中搜索类的策略. JarScan,扫描所有子文件夹中的特定类的所有JAR文件
更新2:JBoss Tattletale也有些相关
我有以下代码行.
sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");
Run Code Online (Sandbox Code Playgroud)
它给出了一个奇怪的问题.如果我从路径中没有空格的路径(文件夹名称)运行它,那么它运行正常.但是如果路径包含任何空格(行"c:\ New Foler ...")那么它就不起作用了.
怎么解决这个?
编辑:更详细 - 我检查了sysloader对象.
sysloader - > UCP - > path
是否有一个字符%20而不是空格的路径
因此,所有URL都为空.
怎么解决这个?
大家好,感谢您的关注!我有一个既容易又明显的问题,但我被卡住了.
我想通过自定义ClassLoader提供动态创建的Java类,供第三方库使用.
现在我的问题是:当我不自己直接加载这些类时,如何设置我的自定义ClassLoader来加载这些类?
我想当我使用我的ClassLoader加载某个类时,它就变成了这个类的ClassLoader,并且从该类加载的所有类都将通过我的ClassLoader引导.
我按照这个官方教程创建了一个自定义的ClassLoader:http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html.
public class DynamicClassloader extends ClassLoader {
private Map<String, Class<?>> classesMap = new HashMap<String, Class<?>>();
public DynamicClassloader(ClassLoader parent) {
// Also tried super(parent);
super(sun.misc.Launcher.getLauncher().getClassLoader());
}
// Adding dynamically created classes
public void defineClass(String name, Class<?> clazz) {
classesMap.put(name, clazz);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// load from parent
Class<?> result = findLoadedClass(name);
if (result != null) {
return result;
}
try {
result = findSystemClass(name);
} catch (Exception …Run Code Online (Sandbox Code Playgroud) 我有一个特定的问题,如何在Android中运行类加载/垃圾收集.我们现在偶然发现了几次这个问题,据我所知,Android在这里与普通的JVM不同.
问题在于:我们目前正在尝试减少应用程序中的单例类,以支持单个根工厂单例,其唯一目的是管理其他管理器类.如果你愿意的话,是一名顶级经理.这使我们可以轻松地替换测试中的实现,而无需选择完整的DI解决方案,因为所有活动和服务共享对该根工厂的相同引用.
这是它的样子:
public class RootFactory {
private static volatile RootFactory instance;
@SuppressWarnings("unused")
private Context context; // I'd like to keep this for now
private volatile LanguageSupport languageSupport;
private volatile Preferences preferences;
private volatile LoginManager loginManager;
private volatile TaskManager taskManager;
private volatile PositionProvider positionManager;
private volatile SimpleDataStorage simpleDataStorage;
public static RootFactory initialize(Context context) {
instance = new RootFactory(context);
return instance;
}
private RootFactory(Context context) {
this.context = context;
}
public static RootFactory getInstance() {
return instance;
}
public LanguageSupport getLanguageSupport() …Run Code Online (Sandbox Code Playgroud) 我的项目目录结构(在Eclipse中):
MyProject/
src/ --> "source directory" on Eclipse's classpath/buildpath
com.me.myapp
Driver
myconfig.txt
Run Code Online (Sandbox Code Playgroud)
在Driver,我有以下代码:
public class Driver {
public static void main(String[] args) {
InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream("myconfig.txt");
if(is == null)
System.out.println("input stream is null");
else
System.out.println("input stream is NOT null :-)");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到以下控制台输出:
input stream is null
Run Code Online (Sandbox Code Playgroud)
为什么?我是否放置myconfig.txt在错误的位置?我是否错误地使用了ClassLoader API?别的什么?提前致谢!
我正在开发一个项目,在这个项目中,我们使用的库不能保证线程安全(并且不是),并且在Java 8流场景中是单线程的,它可以按预期工作.
我们希望使用并行流来获得低悬挂可扩展性的成果.
不幸的是,这导致库失败 - 很可能是因为一个实例干扰了与另一个实例共享的变量 - 因此我们需要隔离.
我正在考虑为每个实例(可能是本地线程)使用单独的类加载器,据我所知,这应该意味着,出于所有实际目的,我需要隔离,但我不熟悉为此目的故意构建类加载器.
这是正确的方法吗?为了获得适当的生产质量,我该如何做?
编辑:我被要求提供有关触发问题的情况的其他信息,以便更好地理解它.问题仍然是关于一般情况,而不是修复图书馆.
我可以完全控制库创建的对象(https://github.com/veraPDF/)
<dependency>
<groupId>org.verapdf</groupId>
<artifactId>validation-model</artifactId>
<version>1.1.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
使用项目maven存储库来存在工件.
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>vera-dev</id>
<name>Vera development</name>
<url>http://artifactory.openpreservation.org/artifactory/vera-dev</url>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
目前,强化图书馆是不可行的.
编辑:我被要求显示代码.我们的核心适配器大致是:
public class VeraPDFValidator implements Function<InputStream, byte[]> {
private String flavorId;
private Boolean prettyXml;
public VeraPDFValidator(String flavorId, Boolean prettyXml) {
this.flavorId = flavorId;
this.prettyXml = prettyXml;
VeraGreenfieldFoundryProvider.initialise();
}
@Override
public byte[] apply(InputStream inputStream) {
try {
return apply0(inputStream);
} catch (RuntimeException e) {
throw e;
} catch (ModelParsingException …Run Code Online (Sandbox Code Playgroud) 我们知道我们可以用以下方式覆盖System 类加载器:
java -Djava.system.class.loader=com.test.MyClassLoader xxx
Run Code Online (Sandbox Code Playgroud)
那么,因为com.test.MyClassLoader它本身就是一个类,它是由谁加载的?
我们如何获得这个"meta"类加载器的类文件?
如果jar在JVM中运行,则可以卸载当前运行的Jar并将其从系统中删除.下载新版本并使用与最后一个Jar相同的名称重命名,然后初始化新Jar,在JVM中创建Jar的无缝更新.甚至可以指示JVM执行此操作吗?甚至可以在运行时更新Jar吗?