Re[12]: Есть ли возможность перезагрузить класс
От: Blazkowicz Россия  
Дата: 24.01.08 10:42
Оценка: 1 (1)
Здравствуйте, fenix13, Вы писали:

F>Вот это, мне очень нравиться . Я по началу тоже пытался так сделать . Но не придумал как удалять старый клас лоадер . Если есть идеи поделитесь . И если например убить старый клас лоадер . То я так понимаю когда я загружу новый лоадер с новой версией класс . То когда понадобиться этот класс — то автоматически подгребётся новая версия класса .

Не надо удалять загрузчики. Надо контролировать потоки, так чтобы они шли через классы и их экземпляры исключительно нового загрузчика.
Re[11]: Есть ли возможность перезагрузить класс
От: fenix13  
Дата: 25.01.08 09:44
Оценка:
Здравствуйте, Blazkowicz

Появилась еще одна интересная задачя . Если есть идеи то подскажы . Сейчас обрисую :

Мне нужно перегрузить метод classloader . А именно чтобы с самого начала работы программы — она лезла в мой класслоадер а не в системный . Возможно ли такое сделать? Мне это нужно для того чтобы контролировать какую именно версию класса мне нужно загружать в момент работы программы .
Если есть вопросы или предложения , давай подискусируем .
Re[12]: Есть ли возможность перезагрузить класс
От: Blazkowicz Россия  
Дата: 25.01.08 09:52
Оценка: 1 (1)
Здравствуйте, fenix13, Вы писали:

F>Появилась еще одна интересная задачя . Если есть идеи то подскажы . Сейчас обрисую :

F>Мне нужно перегрузить метод classloader . А именно чтобы с самого начала работы программы — она лезла в мой класслоадер а не в системный . Возможно ли такое сделать? Мне это нужно для того чтобы контролировать какую именно версию класса мне нужно загружать в момент работы программы .
F>Если есть вопросы или предложения , давай подискусируем .

Да, проще простого. Все твои классы нужно сделать недоступным для класслоадера который обычно их загружеает. Затем в коде создать экземпляр своего класслоадера, научить его искать твои классы, и далее все обращения вести через него. Там уже надо смотреть по ситуации и окружению. Thread.setContextClassloader(), либо просто загрузить класс своим класслоадером, а этот класс уже будет подтягивать зависимости только через этот же класслоадер. В общем штудируй API к классам ClassLoader/URLClassLoader, смотри исходный код этих классов и все у тебя получится.
Re[12]: Есть ли возможность перезагрузить класс
От: dshe  
Дата: 25.01.08 10:15
Оценка: 7 (1)
Здравствуйте, fenix13, Вы писали:

F>Здравствуйте, Blazkowicz


F>Появилась еще одна интересная задачя . Если есть идеи то подскажы . Сейчас обрисую :


F>Мне нужно перегрузить метод classloader . А именно чтобы с самого начала работы программы — она лезла в мой класслоадер а не в системный . Возможно ли такое сделать? Мне это нужно для того чтобы контролировать какую именно версию класса мне нужно загружать в момент работы программы .

F>Если есть вопросы или предложения , давай подискусируем .

Возможно тебе поможет свойство java.system.class.loader подменить системный класслоадер. Параметром является имя класса класслоадера, который должен иметь конструктор с одном параметром, принимающим родительский класслоадер. Например,
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class My extends URLClassLoader {

    public My(ClassLoader parent) throws Exception {
        super(new URL[] { new File("./classes").toURL() }, parent);
    }
}

запуск
java -Djava.system.class.loader=My Main


Для полноты картины пусть Main класс выводит цепочку класслоадеров
public class Main {
    public static void main(String[] args) {
        for (ClassLoader loader = Main.class.getClassLoader(); loader != null; loader = loader.getParent()) {
            System.out.print(loader == ClassLoader.getSystemClassLoader() ? "system " : "       ");
            System.out.println(loader);
        }
    }
}


Тогда с подмененным класслоадером цепочка выглядит так
system My@42e816
       sun.misc.Launcher$AppClassLoader@7d772e
       sun.misc.Launcher$ExtClassLoader@11b86e7

А со стандартным
system sun.misc.Launcher$AppClassLoader@d9f9c3
       sun.misc.Launcher$ExtClassLoader@9cab16

Т.е. свой класслоадер загружается стандартным системным (AppClassLoader) и он же передается в качестве родительского.
--
Дмитро
Re[13]: Есть ли возможность перезагрузить класс
От: fenix13  
Дата: 25.01.08 11:10
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Да, проще простого. Все твои классы нужно сделать недоступным для класслоадера который обычно их загружеает. Затем в коде создать экземпляр своего класслоадера, научить его искать твои классы, и далее все обращения вести через него. Там уже надо смотреть по ситуации и окружению. Thread.setContextClassloader(), либо просто загрузить класс своим класслоадером, а этот класс уже будет подтягивать зависимости только через этот же класслоадер. В общем штудируй API к классам ClassLoader/URLClassLoader, смотри исходный код этих классов и все у тебя получится.


Ты меня натолкнул вобще на сногсшибательную идею : я только что сделал тестовую прогу которая в самом начале — просто напросто копирует либы из моего дочернего сервера в дерикторию класпаза — таким образом либы просто подменяются — и когда происходит загрузка обьекта — он уже все танет с новых либ .

Это работает 100%

Что ты думаешь по этому поводу ? насколько это безопасный вариант ?
Re[14]: Есть ли возможность перезагрузить класс
От: Blazkowicz Россия  
Дата: 25.01.08 11:24
Оценка:
Здравствуйте, fenix13, Вы писали:

F>Ты меня натолкнул вобще на сногсшибательную идею : я только что сделал тестовую прогу которая в самом начале — просто напросто копирует либы из моего дочернего сервера в дерикторию класпаза — таким образом либы просто подменяются — и когда происходит загрузка обьекта — он уже все танет с новых либ .

Понимаешь ли в чем дело. Я понятия не имею кто такой дочерний сервер, что да дирекотрия класпаза и в каком контектсе работает твое приложение вообще. Standalone, J2EE, Spring, Eclipse RCP.

F>Это работает 100%

Не ясно зачем копировать либы со старта, если их можно вообще не помещать куда не надо. Есть ещё такая бага под виндой, что когда URLClassLoader загружает класс из jar, то jar лочится файловой системой.

F>Что ты думаешь по этому поводу ? насколько это безопасный вариант ?

На безопасный вариант не похоже, а так ХЗ, что там за приложение на этим скрывается.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.