2016-02-03 2 views
0

Есть ли способ перезаписать файлы классов/jar внутри дочернего загрузчика классов.Java Childloadloader перезаписывает родителя

В настоящее время я хочу запустить еще одну версию Jar внутри моего дочернего загрузчика классов, которая уже загружена в мой родительский загрузчик классов. Есть ли способ сделать это?

+1

Вы всегда можете изменить байт-код классов для загрузки, поэтому они загружаются с каким-то префиксом. – Ferrybig

+0

Можете ли вы объяснить это более подробно? –

+0

Если ваш новый загрузчик классов не должен использовать классы другого существующего загрузчика классов, почему вы делаете его дочерним элементом старого загрузчика классов? – Holger

ответ

0

Вы пытаетесь решить проблему самостоятельно. Если вы не хотите, чтобы ваш загрузчик классов делегировал родителям, не создавайте его с этим родителем. Вот простой пример того, как класс загружает другую версию. Все это должно заботиться о, не использовать свой собственный загрузчик класса в качестве родителя новой, но родитель собственного загрузчика

 parent loader 
     ↑   ↑ 
my own loader the new loader 

import java.io.IOException; 
import java.net.URL; 
import java.net.URLClassLoader; 

public class Reloader { 
    static { 
    System.out.println("Initializing one version of the class"); 
    } 
    public static void main(String[] args) throws IOException, ReflectiveOperationException { 
    Class<?> myClass=Reloader.class; 
    ClassLoader myLoader=myClass.getClassLoader(); 
    URL[] u={ myClass.getProtectionDomain().getCodeSource().getLocation() }; 
    // don't use our class loader but its parent loader: 
    try(URLClassLoader newLoader=new URLClassLoader(u, myLoader.getParent())) { 
     // load another version of our class in a different loader context 
     Class<?> newVersion = newLoader.loadClass(myClass.getName()); 
     // see: it's a different class now 
     System.out.println(myClass==newVersion); 
     // having the same name 
     System.out.println(myClass.getName()==newVersion.getName()); 
     newVersion.newInstance();// trigger initializer 
    } 
    } 
} 

Online test on Ideone:

стандартный вывод

Initializing one version of the class 
false 
true 
Initializing one version of the class 

 Смежные вопросы

  • Нет связанных вопросов^_^