Здравствуйте, Alex Korovyansky, Вы писали:
AK>Неужели нельзя...
сомневаюсь. класс это не просто файл. у него есть пакет, он ссылается на другие класы. а если ты загружаеш класс в котором если ссылка на другой класс. откуда класслоадер найдет этот класс??
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Давайте. AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости AK>подробнее о них можно прочитать например здесь
AK>на входе у нас есть сам пакет состоящий из собранных .class файлов. AK>что скажете?
Я скажу, что неразбериха пошла в топике. Высокие договаривающиеся стороны на мой взгляд не понимают друг друга. То, как ситуация видится со стороны:
Вопрос заключается в том, как получить объект класса Class для имеющегося файла, содержащего откомпилированный класс. При этом сам файл может находиться в произвольном месте файловой системы.
Ответ, который дают, заключается в том, что для того, чтобы стандартный механизм загрузки классов работал, необходимо не только иметь файл *.class, но и иметь его размещенным в файловой системе таким образом, чтобы структура родительских директорий этого файла начиная с корня, указанного в classpath, совпадала с именем пакета файла.
Варианты решений:
размещать файл *.class соблюдая указанные выше условия и использовать стандартный механизм загрузки классов;
самостоятельно производить начальный парсинг байткода класса с целью выяснения его полного имени (т.е. имя пакета + имя класса), использовать потом эту информацию и механизм кастомной загрузки классов, упоминавшийся выше по топику;
Если нет адских ограничений, вынуждающих использовать второй вариант, выбираем первый.
DZ>Вопрос заключается в том, как получить объект класса Class для имеющегося файла, содержащего откомпилированный класс. При этом сам файл может находиться в произвольном месте файловой системы.
да...
Хотелось получить ответ на несложный казалось бы вопрос.
denis.zhdanov абсолютно точно понял суть вопроса,
как получить объект класса Class для имеющегося файла, содержащего откомпилированный класс. При этом сам файл может находиться в произвольном месте файловой системы.
Причем естественно самым простым образом.
в итоге через изменение classpath у меня не получилось(фрагмент кода я приводил)
с помощью ClassLoader получилось.
AK>А как сделать тоже самое зная абсолютный путь к class-файлу AK>например D:\\MyClass.class?
надо свой ClassLoader написать, который будет понимать такие запросы и грузить class из пути
Здравствуйте, raydac, Вы писали:
AK>>А как сделать тоже самое зная абсолютный путь к class-файлу AK>>например D:\\MyClass.class? R>надо свой ClassLoader написать, который будет понимать такие запросы и грузить class из пути
если свой писать как я уже писал юзаеш defineClass
а можно воспользватся URLClassLoader. помнится мне что им можно обойтись(могу ощибатся.).
Здравствуйте, Passer, Вы писали: P>в ClassLoader.defineClass можно передавать байтовый массив с содержимым .class файла.
А как-нибудь проще можно?
В чем вообще разница между тем же самым классом String из стандартной библиотеки
и моим классом MyClass для механизма reflection?
Почему для String можно легко обойтись вызовом getClass, а для MyClass нужно пользоваться ClassLoader
Здравствуйте, Alex Korovyansky, Вы писали:
AK>А как-нибудь проще можно? AK>В чем вообще разница между тем же самым классом String из стандартной библиотеки AK>и моим классом MyClass для механизма reflection? AK>Почему для String можно легко обойтись вызовом getClass, а для MyClass нужно пользоваться ClassLoader
разница в том что стандартные крассы находятся в местах где стандартный класслоадер может их легко найти и загрузить.
а твой класс может быть где угодно.
Здравствуйте, Passer, Вы писали:
P>разница в том что стандартные крассы находятся в местах где стандартный класслоадер может их легко найти и загрузить. P>а твой класс может быть где угодно.
Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал
и мог легко всё сделать и для MyClass?
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал AK>и мог легко всё сделать и для MyClass?
AK>Неужели нельзя...
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Добрый день! AK>Пользуясь reflection можно получить объект типа Class по имени класса AK>Например: Class myClass = Class.forName("java.lang.String");
AK>А как сделать тоже самое зная абсолютный путь к class-файлу AK>например D:\\MyClass.class?
Здравствуйте, Passer, Вы писали:
P>сомневаюсь. класс это не просто файл. у него есть пакет, он ссылается на другие класы. а если ты загружаеш класс в котором если ссылка на другой класс. откуда класслоадер найдет этот класс??
Согласен, но я же не собираюсь создавать объекты класса. Мне всего лишь нужно прочитать в каком пакете находится класс, какие методы и поля он содержит, чьим наследников явлеяется и какие интерфейсы реализует. Или такой статический разбор .class файла недопустим?
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Я же знаю где находится мой класс, как сделать чтобы стандартный ClassLoader тоже это знал AK>и мог легко всё сделать и для MyClass?
Здравствуйте, 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, и наверняка вы пытаетесь решить какую-то другую задачу методом операций на гландах автогеном через задний проход.
давайте всё же вернёмся к истокам и попытаемся сформулировать исходную задачу.
Здравствуйте, 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>подробнее о них можно прочитать например здесь
что-то у меня по данной ссылке по центру экрана висит баннер "бесплатное порно"... как-то читать неудобно
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости AK>подробнее о них можно прочитать например здесь
AK>на входе у нас есть сам пакет состоящий из собранных .class файлов. AK>что скажете?
AK>может я что-нибудь не так делаю, сама идея мне нравится
Данная пропертя всего лишь отражает classpath для загрузчика приложения. Модификация значения же на самом загрузчике никак не сказывается. Classpath устанавливается при запуске JVM
java -cp D:\ ...
Но надо не забывать так же о пакетах и особенностях классов пакета по-умолчанию. В общем нюансов так много, что с наскока задачу не решить.
Здравствуйте, Alex Korovyansky, Вы писали:
AK>Давайте. AK>Необходимо для пакета посчитать меру абстрактности и меру устойчивости AK>подробнее о них можно прочитать например здесь
AK>на входе у нас есть сам пакет состоящий из собранных .class файлов. AK>что скажете?
Ну если тебе это все нужно для статического анализа, без контекста выполнения, то скорее всего тебе нужно воспользоваться библиотекой манипушяции байткодом. Я сам особо с ними не возился но слышал что asm самая продвинутая. Там парсер работает как SAX XML парсер. Тоесть памяти много не жрет для построения модели класс файла. Конечно такого рода библиотеки нужны в основном для модификации классов в рантайме, но для твоей задачи тоже сгодятся. А рефлексия в java скорее всего тебе не подайдет. У нее другие задачи и она их делает хорошо.
Вам, пожалуй, вообще не нужно загружать классы. Зачем вам их статические члены (у которых есть инициализаторы, которые могут выполнить любой нехороший код)?
Пользуйтесь Javassist или BCEL.
RT>Вам, пожалуй, вообще не нужно загружать классы. Зачем вам их статические члены (у которых есть инициализаторы, которые могут выполнить любой нехороший код)?
С инициализаторами я погорячился, они не обязательно будут выполняться. Но всё равно рекоммендую посмотреть на Javassist или BCEL.