Отражение из 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.