Tag: classloader

是否可以创建指向内存中对象的URL?

我正在尝试通过将JPA配置设置为自动(和可移植)来扩展我的库以集成Swing和JPA ,这意味着以编程方式添加元素。 (我知道它可以通过Hibernate的AnnotationConfiguration或EclipseLInk的ServerSession ,但是 – 可移植性)。 我也想避免将Spring用于此目的。 我可以动态创建一个persistence.xml ,并用指定包中的元素填充它(通过Reflections库)。 当我尝试将此persistence.xml提供给JPA提供程序时,问题就开始了。 我能想到的唯一方法是设置一个URLClassLoader ,但我想不出一种方法,首先不能让我把文件写到磁盘上,因为它只能获得有效的URL 。 通过URL ( localhost:xxxx )设置套接字来提供文件似乎……我不知道,邪恶? 有谁知道如何解决这个问题? 我知道避免使用一个库听起来很多工作,但我只想知道它是否可以完成。 编辑 (尝试更清楚): 动态生成的XML保存在String对象中。 我不知道如何将它提供给持久性提供程序 。 另外,我想避免将文件写入磁盘。 出于我的问题的目的, 持久性提供程序只是一个类,它扫描META-INF/persistence.xml的类路径。 可以使一些实现接受动态创建XML ,但是没有通用接口(特别是对于文件的关键部分, 标记)。 我的想法是建立一个自定义的ClassLoader – 如果你有任何其他的我会感激,我不会在这个上面。 我能找到的唯一易于扩展/可配置的是URLClassLoader 。 它适用于URL对象,我不知道是否可以创建一个而不首先实际将XML写入磁盘。 这就是我正在设置的方法,但它的工作原理是将persistenceXmlFile = new File(“META-INF/persistence.xml”)写入磁盘: Thread.currentThread().setContextClassLoader( new URLResourceClassLoader( new URL[] { persistenceXmlFile.toURI().toURL() }, Thread.currentThread().getContextClassLoader() ) ); URLResourceClassLoader是URLCLassLoader的子类,它允许通过重写public Enumeration findResources(String name)来查找资源和类。

如何使jvm加载我的java.lang.String而不是rt.jar中的那个

我经常研究java类加载器。 现在我想编写一个与rt.jar中的类名相同的包名和类名的类。 例如,自己编写一个java.lang.String类,以及如何打破父代委托模型以使jvm加载我的java.lang.String而不是rt.jar中的那个。 重新编辑 谢谢,试了一下。 ↓↓↓ D:\> java -verbose -Xbootclasspath / p:D:/myrt.jar -jar exe.jar [打开D:\ myrt.jar] [打开C:\ java \ jre \ lib \ rt.jar] [从C:\ java \ jre \ lib \ rt.jar加载java.lang.Object] [从D:\ myrt.jar加载java.lang.String] [从C:\ java \ jre \ lib \ rt.jar加载java.io.Serializable] [从C:\ java \ jre \ lib \ rt.jar加载java.lang.reflect.GenericDeclaration] [从C:\ java \ jre \ […]

如何在Sun的JVM中禁用延迟类加载/初始化?

默认情况下,Sun的JVM都懒惰地加载类并且懒惰地初始化(即调用它们的方法)它们。 考虑以下类ClinitBomb ,它在static{}块期间抛出Exception 。 public class ClinitBomb { static { explode(); } private static void explode() { throw new RuntimeException(“boom!”); } } 现在,考虑如何触发炸弹: public class Main { public static void main(String[] args) { System.out.println(“A”); try { Class.forName(“ClinitBomb”); } catch (Exception e) { e.printStackTrace(System.out); } System.out.println(“B”); ClinitBomb o2 = new ClinitBomb(); System.out.println(“C”); } } 我们保证爆炸发生在B点之前,因为forName的文件说明了这一点; 问题是它是否发生在A点之前( […]

使用Reflections google库的unit testing仅在Maven执行时失败

我正在使用Google Reflections库来查询类路径中的某些资源。 这些资源位于与项目中的类相同的位置。 我写了一些在Eclipse中作为unit testing执行时成功的unit testing,但是当我尝试用Maven执行它们时(例如使用maven install ),它们没有按预期工作。 经过一些调试,显然问题是当使用Maven执行时,Reflections库找不到资源所在的类路径url。 我得出结论,研究Reflection如何确定应检查的类路径URL。 作为示例,以下方法显示了在给定类加载器的情况下Reflection如何找到可用的类路径URL(原始的Reflection方法已经简化了一点): public static Set forClassLoader(ClassLoader… classLoaders) { final Set result = Sets.newHashSet(); for (ClassLoader classLoader : classLoaders) { while (classLoader != null) { if (classLoader instanceof URLClassLoader) { URL[] urls = ((URLClassLoader) classLoader).getURLs(); if (urls != null) { result.addAll(Sets.newHashSet(urls)); } } classLoader = classLoader.getParent(); } […]

使用自定义类加载器配置org.apache.log4j.ConsoleAppender

我有一个java类,它在启动时基于javassist类加载器创建一个自定义类加载器,然后运行真正的程序类。 我收到以下错误: log4j:ERROR A “org.apache.log4j.ConsoleAppender” object is not assignable to a “org.apache.log4j.Appender” variable. log4j:ERROR The class “org.apache.log4j.Appender” was loaded by log4j:ERROR [javassist.Loader@6f97b10a] whereas object of type log4j:ERROR “org.apache.log4j.ConsoleAppender” was loaded by [java.net.URLClassLoader@5b414a8d]. log4j:ERROR Could not instantiate appender named “stdout”. 问题与以下事实有关:一个对象由原始类加载器创建,而另一个对象由自定义类加载器创建。 有没有办法解决这个错误? 提前致谢, 阿夫纳

jvm是否加载了类路径提到的所有类?

当我们使用-cp命令调用java命令时,我们提供了一些目录和jar文件。 jvm是否加载了类路径提到的所有类或者它只是jvm在需要时会查找的所有类的超级集合?

“当一个class级加载”实际意味着什么?

据说java中的静态块只在加载该类时运行一次。 但它究竟意味着什么? 在哪一点上是由JVM(Java虚拟机)加载的类? 是否在调用该类中的main方法时? 并且当main方法开始执行时,是否还加载了同一类的所有超类? 考虑A扩展B和B扩展C.所有都有静态块。 如果A有main方法,那么静态块的执行顺序是什么?

如何在Java中实现抽象的单例类?

这是我的示例抽象单例类: public abstract class A { protected static A instance; public static A getInstance() { return instance; } //…rest of my abstract methods… } 以下是具体实施: public class B extends A { private B() { } static { instance = new B(); } //…implementations of my abstract methods… } 不幸的是我无法在B类中获取静态代码来执行,因此实例变量永远不会被设置。 我试过这个: Class c = B.class; A.getInstance() […]

Java ClassLoader是否加载内部类?

如果我有一个内部类声明,例如: Class A { public static class B { } } 其次是: Class implClass = getClass().getClassLoader().loadClass(“A”); A $ B内部类也会加载吗? 如果B内部类没有被声明为“静态”怎么办?

getSystemResourceAsStream()返回null

Hiii …我想使用getSystemResourceAsStream()将属性文件的内容输入到InputStream类对象中。 我已经构建了示例代码。 它使用main()方法很好用,但是当我部署项目并在服务器上运行时,无法获取属性文件路径…所以inputstream对象存储空值。 示例代码在这里.. public class ReadPropertyFromFile { public static Logger logger = Logger.getLogger(ReadPropertyFromFile.class); public static String readProperty(String fileName, String propertyName) { String value = null; try { //fileName = “api.properties”; //propertyName = “api_loginid”; System.out.println(“11111111…In the read proprty file…..”); // ClassLoader loader = ClassLoader.getSystemClassLoader(); InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName); System.out.println(“In the read proprty file…..”); System.out.println(“File […]