Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 05:52
Оценка:
Добрый день!
Пользуясь reflection можно получить объект типа Class по имени класса
Например: Class myClass = Class.forName("java.lang.String");

А как сделать тоже самое зная абсолютный путь к class-файлу
например D:\\MyClass.class?

пробывал передавать абсолютный путь в метод forName
вылетает исключение ClassNotFoundException

Спасибо!
So many men, so many minds...
Re: Отражение из class-файла
От: raydac Эстония http://www.igormaznitsa.com
Дата: 25.11.08 06:05
Оценка:
AK>А как сделать тоже самое зная абсолютный путь к class-файлу
AK>например D:\\MyClass.class?
надо свой ClassLoader написать, который будет понимать такие запросы и грузить class из пути
https://github.com/raydac
Re: Отражение из class-файла
От: Passer  
Дата: 25.11.08 06:06
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:


AK>А как сделать тоже самое зная абсолютный путь к class-файлу

AK>например D:\\MyClass.class?

в ClassLoader.defineClass можно передавать байтовый массив с содержимым .class файла.
Re[2]: Отражение из class-файла
От: Passer  
Дата: 25.11.08 06:11
Оценка:
Здравствуйте, raydac, Вы писали:

AK>>А как сделать тоже самое зная абсолютный путь к class-файлу

AK>>например D:\\MyClass.class?
R>надо свой ClassLoader написать, который будет понимать такие запросы и грузить class из пути

если свой писать как я уже писал юзаеш defineClass
а можно воспользватся URLClassLoader. помнится мне что им можно обойтись(могу ощибатся.).
Re[2]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 06:11
Оценка:
Здравствуйте, Passer, Вы писали:
P>в ClassLoader.defineClass можно передавать байтовый массив с содержимым .class файла.

А как-нибудь проще можно?
В чем вообще разница между тем же самым классом String из стандартной библиотеки
и моим классом MyClass для механизма reflection?
Почему для String можно легко обойтись вызовом getClass, а для MyClass нужно пользоваться ClassLoader
So many men, so many minds...
Re[3]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 06:14
Оценка:
AK>Почему для String можно легко обойтись вызовом getClass, а для MyClass нужно пользоваться ClassLoader

поправка вызовом не GetClass, а forName ...
So many men, so many minds...
Re[3]: Отражение из class-файла
От: Passer  
Дата: 25.11.08 06:17
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>А как-нибудь проще можно?

AK>В чем вообще разница между тем же самым классом String из стандартной библиотеки
AK>и моим классом MyClass для механизма reflection?
AK>Почему для String можно легко обойтись вызовом getClass, а для MyClass нужно пользоваться ClassLoader

разница в том что стандартные крассы находятся в местах где стандартный класслоадер может их легко найти и загрузить.
а твой класс может быть где угодно.
Re[4]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 06:24
Оценка:
Здравствуйте, Passer, Вы писали:

P>разница в том что стандартные крассы находятся в местах где стандартный класслоадер может их легко найти и загрузить.

P>а твой класс может быть где угодно.

Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал
и мог легко всё сделать и для MyClass?

Неужели нельзя...
So many men, so many minds...
Re[5]: Отражение из class-файла
От: abch-98-ru Россия  
Дата: 25.11.08 06:34
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал

AK>и мог легко всё сделать и для MyClass?

AK>Неужели нельзя...


гугл, первая ссылка
Re[5]: Отражение из class-файла
От: Passer  
Дата: 25.11.08 06:35
Оценка: 1 (1)
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Неужели нельзя...

сомневаюсь. класс это не просто файл. у него есть пакет, он ссылается на другие класы. а если ты загружаеш класс в котором если ссылка на другой класс. откуда класслоадер найдет этот класс??

кстати вот накинул. вроже должно работать.

public class tmp extends ClassLoader{
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        if(name.indexOf("//")>-1)
        {
            try {
                FileInputStream fis=new FileInputStream(name);
                byte[] b;
                //
                // tut chitaem fayl v massiv
                //

                return defineClass(null,b,0,b.length);
            } catch (FileNotFoundException e) {
                throw new ClassNotFoundException();
            }
        }else{
            return findSystemClass(name);
        }
    }
}

Добавлена подсветка кода
Re: Отражение из class-файла
От: abch-98-ru Россия  
Дата: 25.11.08 06:35
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Добрый день!

AK>Пользуясь reflection можно получить объект типа Class по имени класса
AK>Например: Class myClass = Class.forName("java.lang.String");

AK>А как сделать тоже самое зная абсолютный путь к class-файлу

AK>например D:\\MyClass.class?

гугл, первая ссылка
Re[2]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 06:55
Оценка:
Здравствуйте, abch-98-ru, Вы писали:

A9R>гугл, первая ссылка


я немного о другом спрашивал...
So many men, so many minds...
Re[6]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 07:01
Оценка:
Здравствуйте, Passer, Вы писали:

P>сомневаюсь. класс это не просто файл. у него есть пакет, он ссылается на другие класы. а если ты загружаеш класс в котором если ссылка на другой класс. откуда класслоадер найдет этот класс??


Согласен, но я же не собираюсь создавать объекты класса. Мне всего лишь нужно прочитать в каком пакете находится класс, какие методы и поля он содержит, чьим наследников явлеяется и какие интерфейсы реализует. Или такой статический разбор .class файла недопустим?
So many men, so many minds...
Re[5]: Отражение из class-файла
От: Blazkowicz Россия  
Дата: 25.11.08 07:37
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал

AK>и мог легко всё сделать и для MyClass?

Учим новый термин: classpath
Re[6]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 07:46
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Учим новый термин: classpath

наслышен про classpath
пробывал с его помощью воспользоваться Class.ForName...
следующим образом:

  String currentCP = System.getProperty("java.class.path").toString();
  System.setProperty("java.class.path", (currentCP + ";" +"D:\\"));
  Class c = Class.forName("MyClass");
  //и так пробывал Class c = Class.forName("D:\\MyClass.class");
  //и так пробывал Class c = Class.forName("D:\\MyClass");


может я что-нибудь не так делаю, сама идея мне нравится
So many men, so many minds...
Re[7]: Отражение из class-файла
От: Аноним  
Дата: 25.11.08 07:59
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Здравствуйте, Blazkowicz, Вы писали:


B>>Учим новый термин: classpath

AK>наслышен про classpath
AK>пробывал с его помощью воспользоваться Class.ForName...
AK>следующим образом:

AK>
AK>  String currentCP = System.getProperty("java.class.path").toString();
AK>  System.setProperty("java.class.path", (currentCP + ";" +"D:\\"));
AK>  Class c = Class.forName("MyClass");
AK>  //и так пробывал Class c = Class.forName("D:\\MyClass.class");
AK>  //и так пробывал Class c = Class.forName("D:\\MyClass");
AK>


AK>может я что-нибудь не так делаю, сама идея мне нравится

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

давайте всё же вернёмся к истокам и попытаемся сформулировать исходную задачу.
Re[8]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 08:10
Оценка:
Здравствуйте, http://dolzhenko.blogspot.com/, Вы писали:

HDB>глядя на этот код я могу сказать, что судя по всему вы не понимаете архитектуры java, и наверняка вы пытаетесь решить какую-то другую задачу методом операций на гландах автогеном через задний проход.

HDB>давайте всё же вернёмся к истокам и попытаемся сформулировать исходную задачу.

Давайте.
Необходимо для пакета посчитать меру абстрактности и меру устойчивости
подробнее о них можно прочитать например здесь

на входе у нас есть сам пакет состоящий из собранных .class файлов.
что скажете?
So many men, so many minds...
Re[9]: Отражение из class-файла
От: Аноним  
Дата: 25.11.08 08:30
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>подробнее о них можно прочитать например здесь


что-то у меня по данной ссылке по центру экрана висит баннер "бесплатное порно"... как-то читать неудобно
Re[9]: Отражение из class-файла
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 25.11.08 08:35
Оценка: 1 (1)
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Давайте.

AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости
AK>подробнее о них можно прочитать например здесь

AK>на входе у нас есть сам пакет состоящий из собранных .class файлов.

AK>что скажете?

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

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

Ответ, который дают, заключается в том, что для того, чтобы стандартный механизм загрузки классов работал, необходимо не только иметь файл *.class, но и иметь его размещенным в файловой системе таким образом, чтобы структура родительских директорий этого файла начиная с корня, указанного в classpath, совпадала с именем пакета файла.

Варианты решений:


Если нет адских ограничений, вынуждающих использовать второй вариант, выбираем первый.
http://denis-zhdanov.blogspot.com
Re[9]: Отражение из class-файла
От: abch-98-ru Россия  
Дата: 25.11.08 08:36
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости

AK>подробнее о них можно прочитать например здесь

AK>на входе у нас есть сам пакет состоящий из собранных .class файлов.

AK>что скажете?

jdepend
Re[3]: Отражение из class-файла
От: abch-98-ru Россия  
Дата: 25.11.08 08:41
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Здравствуйте, abch-98-ru, Вы писали:


A9R>>гугл, первая ссылка


AK>я немного о другом спрашивал...


предлагаете отгадать?

попробую. вопрос номер 2?
Re[10]: Отражение из class-файла
От: abch-98-ru Россия  
Дата: 25.11.08 08:56
Оценка: +1
Здравствуйте, denis.zhdanov, Вы писали:


DZ>Вопрос заключается в том, как получить объект класса Class для имеющегося файла, содержащего откомпилированный класс. При этом сам файл может находиться в произвольном месте файловой системы.


Не, Динь, вопрос, как раз, в другом
Автор: Alex Korovyansky
Дата: 25.11.08

И очень славно, что Alex, таки сформулировал исходную(надеюсь) задачу.
Re[7]: Отражение из class-файла
От: Blazkowicz Россия  
Дата: 25.11.08 09:02
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>
AK>  String currentCP = System.getProperty("java.class.path").toString();
AK>

AK>может я что-нибудь не так делаю, сама идея мне нравится

Данная пропертя всего лишь отражает classpath для загрузчика приложения. Модификация значения же на самом загрузчике никак не сказывается. Classpath устанавливается при запуске JVM
java -cp D:\ ...

Но надо не забывать так же о пакетах и особенностях классов пакета по-умолчанию. В общем нюансов так много, что с наскока задачу не решить.
Re[4]: Отражение из class-файла
От: Alex Korovyansky Россия  
Дата: 25.11.08 09:02
Оценка: :)
да...
Хотелось получить ответ на несложный казалось бы вопрос.
denis.zhdanov абсолютно точно понял суть вопроса,
как получить объект класса Class для имеющегося файла, содержащего откомпилированный класс. При этом сам файл может находиться в произвольном месте файловой системы.

Причем естественно самым простым образом.
в итоге через изменение classpath у меня не получилось(фрагмент кода я приводил)
с помощью ClassLoader получилось.

спасбо всем, особенно Passer, denis.zhdanov
So many men, so many minds...
Re[9]: Отражение из class-файла
От: Nicht Россия  
Дата: 25.11.08 09:33
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

AK>Давайте.

AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости
AK>подробнее о них можно прочитать например здесь

AK>на входе у нас есть сам пакет состоящий из собранных .class файлов.

AK>что скажете?

Ну если тебе это все нужно для статического анализа, без контекста выполнения, то скорее всего тебе нужно воспользоваться библиотекой манипушяции байткодом. Я сам особо с ними не возился но слышал что asm самая продвинутая. Там парсер работает как SAX XML парсер. Тоесть памяти много не жрет для построения модели класс файла. Конечно такого рода библиотеки нужны в основном для модификации классов в рантайме, но для твоей задачи тоже сгодятся. А рефлексия в java скорее всего тебе не подайдет. У нее другие задачи и она их делает хорошо.
Re: Отражение из class-файла
От: RomikT Германия  
Дата: 29.11.08 11:34
Оценка:
Здравствуйте, Alex Korovyansky, Вы писали:

Вам, пожалуй, вообще не нужно загружать классы. Зачем вам их статические члены (у которых есть инициализаторы, которые могут выполнить любой нехороший код)?
Пользуйтесь Javassist или BCEL.
Re[2]: Отражение из class-файла
От: RomikT Германия  
Дата: 29.11.08 11:36
Оценка:
RT>Вам, пожалуй, вообще не нужно загружать классы. Зачем вам их статические члены (у которых есть инициализаторы, которые могут выполнить любой нехороший код)?
С инициализаторами я погорячился, они не обязательно будут выполняться. Но всё равно рекоммендую посмотреть на Javassist или BCEL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.