【问题标题】:java custom classloader: some classes are not loaded by my classloaderjava自定义类加载器:我的类加载器未加载某些类
【发布时间】:2011-01-23 20:57:17
【问题描述】:

我正在编写一个自定义类加载器,我已通过使用参数将其设置为默认类加载器

-Djava.system.class.loader=MyClassLoader

大部分类都是由我的类加载器加载的,但有些类没有,为什么? 这些类在一个外部 jar 文件中。

更新 这里是一个例子

public class Main{
    public static void main(String[] args) {
        try{
            // A simple class loader, ovveride loadClass
            // method and print in stdout the name of the class loaded.
            MyClassLoader classLoader=new MyClassLoader(MyClassLoader.class.getClassLoader());
            Class init=classLoader.loadClass("Initializer");
            Object instance=init.newInstance();
            init.getMethod("init").invoke(instance);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

public class A{

    public A() {
        System.out.println("Im A");
    }
}

public class Initializer {

     public void init() {
        A a=new A();
    }
}

问题是:我希望类 A 被我的类加载器加载,但这并没有发生,为什么?

更新

无论如何,我想用我的类加载器加载我的所有类,因为我想加密类代码并在运行时解密它。 那么,如何将我的类加载器用作我所有类的默认类加载器?

谢谢。

【问题讨论】:

  • 你的 CL 没有加载哪些类?
  • 我的水晶球闪闪发光,好像在这种特殊情况下发生了 ClassNotFoundException,而我的 java woodoo 娃娃拒绝在没有堆栈跟踪的情况下继续 :)
  • 我想你的水晶球坏了,我也不例外,一切正常,但我注意到有些类没有被我的类加载器加载。 (加载类时我在标准输出中打印)
  • 旁注:如果您要在运行时解密,那么所有需要解密的信息都可用于主机/客户端计算机。这不会使您的应用程序安全。只是比平常更难闯入。这值得么?还是客户要求?
  • 是的在客户端机器中,它作为许可证密钥工作。通过自定义解密算法并将密钥隐藏在机器中,我达到了相当高的安全级别。我只需要混淆和保护一个类,即类加载器。这无疑更容易和更强大地混淆我项目的所有类。

标签: java classloader


【解决方案1】:

java.lang 下的任何内容都将始终由引导类加载器加载。

来自http://en.wikipedia.org/wiki/Java_Classloader

JVM启动时,三个类 使用装载机[3][4]:

  1. 引导类加载器
  2. 扩展类加载器
  3. 系统类加载器

引导类加载器加载 核心 Java 库[5] (/lib 目录)。这 类加载器,它是 核心JVM,是用本机代码编写的。

扩展类加载器加载 扩展目录中的代码 (/lib/ext 或任何其他 指定的目录 java.ext.dirs 系统属性)。这是 由实施 sun.misc.Launcher$ExtClassLoader 类。

【讨论】:

  • 是我的外部 jar 类。这个 jar 是我的类库。
  • @blow,我不明白你问题的第一句话。
  • @blow, “Is a my class of my external jar”以“Is”开头,所以我认为这是一个问题。
  • Samule:啊,对不起。不,不是问题对不起。无论如何,我注意到在我的第一篇文章中的示例中,只有 Initializer 是通过我的类加载器加载的,A 类是默认加载的类加载器(我认为)。在一些教程中,我读到子类(在这种情况下为 A)加载了与父类(在这种情况下为 Initializer)相同的类加载器,那么为什么这不起作用?
猜你喜欢
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多