标签: classloader

是否可以定义一个Java ClassLoader,它返回与请求的类完全不同的类?

我试过这个,但在调用时得到一个ClassNotFoundException:

Class.forName("com.AClass", false, mySpecialLoader)
Run Code Online (Sandbox Code Playgroud)

java reflection classloader

2
推荐指数
1
解决办法
555
查看次数

通过Class.forName从Java加载JRuby类

我在Java代码中有以下类:

public class CHRTreeCreator extends IndexCreator { ... }
Run Code Online (Sandbox Code Playgroud)

相反,CHRTreeCreator我想使用也扩展的不同实现IndexCreator,但我想在JRuby中编写代码.问题是,IndexCreator基于xml配置文件选择了具体实现:

<creator>dwe.index.tree.chr.CHRTreeCreator</creator>
Run Code Online (Sandbox Code Playgroud)

代码如下所示:

// className is fetched from XML
Class creatorClass = Class.forName(className);
Constructor constructor = creatorClass.getConstructor(new Class[] {  });
creator = (IndexCreator) constructor.newInstance(new Object[] { });
Run Code Online (Sandbox Code Playgroud)

问题是,是否可以在Ruby中实现它,如下所示:

class MyIndexCreator < IndexCreator
end
Run Code Online (Sandbox Code Playgroud)

并以某种方式将MyIndexCreator类名放入XML配置文件中.在这种情况下,模块 - 包映射如何工作?

如果不能通过Java的Class.forName加载Ruby类,我该如何解决这个问题?

java jruby classloader

2
推荐指数
1
解决办法
989
查看次数

有没有办法打开某种JVM日志记录,所以我可以看到在类加载等过程中发生了什么

我正在尝试优化我的Java Web应用程序的启动时间/类加载时间,因为它在Google App Engine和启动时间非常重要.

有没有办法可以打开某种类加载调试消息,或者某种方式来查看类加载时花费的时间?我想看看是否有任何特定的库需要一段时间才能加载,然后如果它们不是必需的话就去掉它们.

java google-app-engine jvm classloader

2
推荐指数
1
解决办法
1148
查看次数

java中的类卸载

当一个类加载器被垃圾收集时,它卸载的类是否被卸载?当JVM运行时是详细模式,所有加载的类都是o/p.同样,JVM会在卸载类时记录吗?

我编写了一个自定义类加载器来测试它,但是没有看到任何详细的日志来卸载类.

CustomClassLoader loader = new CustomClassLoader(new URL[]{}, CustomClassLoader.class.getClassLoader());
    loader.addURL("D:\\workspace\\ClassLoaderTest\\implementation.jar");

    Class c = null;
    try {
        c = Class.forName("Horse",false,loader);
        if (c != null) {
            try {
                Animal animal = (Animal)c.newInstance();
                animal.eat();
            }
            catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
            c = null;
    loader = null;
    byte[] b = new byte[58*1024*1024];
    System.gc();
    ClassLoadingMXBean clBean = ManagementFactory.getClassLoadingMXBean();
    System.out.println("Number of classes currently loaded " + clBean.getLoadedClassCount());
    System.out.println("Number of classes loaded totally " + clBean.getTotalLoadedClassCount());
    System.out.println("Number of classes unloaded …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection classloader

2
推荐指数
1
解决办法
2269
查看次数

为什么Java类加载器找不到我的界面?

在下面的代码中,我使用动态生成一个类sun.tools.javac.Main.我将使用Reflection创建此类的新实例.问题是,我想避免使用Reflection来调用我为这个类定义的方法,所以我创建了一个ProxyInvoker,它引用了我在项目中定义的接口.为了让类加载器看到这一点,我将类路径添加到我的类加载器的Executable接口.在"编译"步骤中,我仍然收到一条错误,指出我的界面未找到.

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class MyClassGenerator {

    static final String generatedClassName = "TestHello_" + System.currentTimeMillis();
    static final String javaFileName = generatedClassName + ".java";

    static URLClassLoader classLoader;

    public static void main(final String args[])
            throws MalformedURLException {
        final ProxyInvoker proxy = new ProxyInvoker();
        generateClass();
        loadExecutableInterface();
        if (compileClass()) {
            System.out.println("Running " + generatedClassName + ":\n\n");
            final Executable ex = createExecutable();
            ex.execute();
        }
        else {
            System.out.println(javaFileName + " is bad.");
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java classloader

2
推荐指数
1
解决办法
3655
查看次数

系统类加载器是否加载了类路径中的所有类,即使它们实际上没有被使用?

我正在使用JDK 1.6来运行一个小应用程序.但是我设置了一个非常庞大的类路径,其中包含很多类.

当我运行应用程序时,即使它们实际上没有在我的应用程序中使用,也会加载类加载器中的所有类?如果没有,如何强制类加载器这样做,如果是,如何避免它?谢谢!

例如,我正在使用ant 1.7来运行我的应用程序.

最诚挚的问候,罗伯特吉

java classpath classloader

2
推荐指数
1
解决办法
1322
查看次数

通过资源加载jdbc驱动程序(Tomcat 7)

我正在尝试使用tomcat jdbc连接池,我在我的应用程序context.xml文件中定义它.

<Context>
    <Resource auth="Container" name="jdbc/iup" type="javax.sql.DataSource"
              maxActive="300" maxIdle="30" maxWait="20000"
              username="${db.username}" password="${db.password}" driverClassName="net.sf.log4jdbc.DriverSpy"
              url="jdbc:log4jdbc:sqlserver://${db.server};databaseName=${db.name}"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

net.sf.log4jdbc.DriverSpy被定义log4jdbc4-1.2.jar,它放在我的应用程序li​​b文件夹中.它对我来说很好.但是在这里说,带有驱动程序类的jar应该只放在tomcat lib文件夹中.

Tomcat使用它的BasicDataSource类加载驱动程序:

if (driverClassName != null) {
            try {
                try {
                    if (driverClassLoader == null) {
                        Class.forName(driverClassName);
                    } else {
                        Class.forName(driverClassName, true, driverClassLoader);
                    }
                } catch (ClassNotFoundException cnfe) {
                    driverFromCCL = Thread.currentThread(
                            ).getContextClassLoader().loadClass(
                                    driverClassName);
                }
            } catch (Throwable t) {
                String message = "Cannot load JDBC driver class '" +
                    driverClassName + "'";
                logWriter.println(message); …
Run Code Online (Sandbox Code Playgroud)

java tomcat jdbc classloader tomcat7

2
推荐指数
1
解决办法
4381
查看次数

获取所有JVM使用的所有Java类的列表?

我希望有一个列表,列出在某个时刻在多个线程/ JVM中加载的所有类.

我知道当你使用-verbose参数运行java时,你可以将它写成一个文件,如下所示:java -verbose:class com.package.Foo > classes-used.txt

但是,我的主程序中有一些线程使用shell脚本来启动一个新的jar.我想避免必须-verbose在每个shell脚本中编写参数,我想知道在Linux上是否还有其他方法可以做到这一点?

java linux classloader

2
推荐指数
1
解决办法
238
查看次数

如何包含同一依赖项的两个不同版本?

我正在为Java中的ERP系统进行定制.在我的自定义中,我想使用Apache POI 3.10.1.因此我整合了罐子poi-3.10.1-20140818.jar和poi-ooxml-3.10.1-20140818.jar.

但是,这些jar包含已经包含在ERP系统核心代码中的几个类,但有差异.

如果核心ERP类覆盖POI类,则自定义会引发运行时异常.如果POI类覆盖核心类,则核心功能可能会发生相同的情况.

处理这样的问题的最佳做法是什么?

我的定制是一个相对孤立的功能.

java classloader conflicting-libraries apache-poi

2
推荐指数
1
解决办法
1425
查看次数

包私有方法似乎没有被覆盖

我使用ASM基于类生成超类ToOverride.我想覆盖它的ToOverride::getValue方法.上面提到的类看起来像:

public abstract class ToOverride {

   Object getValue(String str, Object arg) throws Exception {
     throw new IllegalStateException("PARENT!");
   }

   Object justMethod() {
     return "test";
   }
}
Run Code Online (Sandbox Code Playgroud)

在普通的java中,期望的类看起来像这样:

public class GeneratedInheritor extends ToOverride {
  @Override
  Object getValue(String str, Object arg) throws Exception {
    return str + arg;
  }
}
Run Code Online (Sandbox Code Playgroud)

我生成了后一个类,导致后面的字节码.

// class version 49.0 (49)
// access flags 0x21
public class com/example/GeneratedInheritor extends com/example/ToOverride {

    // access flags 0x1
    public <init>()V
        ALOAD 0
        INVOKESPECIAL com/example/ToOverride.<init> ()V
        RETURN
        MAXSTACK …
Run Code Online (Sandbox Code Playgroud)

java overriding classloader java-bytecode-asm

2
推荐指数
1
解决办法
433
查看次数