Список классов пакета
От: Бердник Антон  
Дата: 24.04.08 12:28
Оценка:
В сущности задачка очень простая, а сходу найти решения не могу.
Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
Кто-нибудь сталкивался с подобной задачей?
Re: Список классов пакета
От: Аноним  
Дата: 24.04.08 12:41
Оценка:
Здравствуйте, Бердник Антон, Вы писали:

БА>В сущности задачка очень простая, а сходу найти решения не могу.

БА>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>Кто-нибудь сталкивался с подобной задачей?

Если такое и есть, в чем я глубоко сомневаюсь, то через ClassLoader.

Такого нету, в чем я глубоко не сомневаюсь, т.к. пакеты — это формальные логические сущности и связь "пакет — подпакет" есть только на уровне файловой системы. Решение — писать свой код, который лазит по файловой системе во всех CLASSPATH местах.
Re: Список классов пакета
От: Blazkowicz Россия  
Дата: 24.04.08 12:47
Оценка:
Здравствуйте, Бердник Антон, Вы писали:

БА>В сущности задачка очень простая, а сходу найти решения не могу.

БА>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>Кто-нибудь сталкивался с подобной задачей?

Много кто сталкивался. Жаль поиск не работает. В общем случае задача не разрешима, так как JVM по большому счету ничего не знает о классах которые ещё не были загружены. Поэтому единственный приемлимый способ это сканировать jar-ы до которых можно докопатся. А зачем понадобилось? Всегда можно найти более приемлемый способ виде какого-нибудь рестра нужных классов.
Re[2]: Список классов пакета
От: Бердник Антон  
Дата: 26.04.08 09:16
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Бердник Антон, Вы писали:


БА>>В сущности задачка очень простая, а сходу найти решения не могу.

БА>>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>>Кто-нибудь сталкивался с подобной задачей?

B>Много кто сталкивался. Жаль поиск не работает. В общем случае задача не разрешима, так как JVM по большому счету ничего не знает о классах которые ещё не были загружены. Поэтому единственный приемлимый способ это сканировать jar-ы до которых можно докопатся. А зачем понадобилось? Всегда можно найти более приемлемый способ виде какого-нибудь рестра нужных классов.


Понадобилось — вот зачем:
Хочется получить список классов, отбираемых по определенному критерию (например, по аннотации какой то)
Указывать все классы не хочется — а хочется стандартизировать их размещение в некотором пакете и указывать только пакет. Вот поэтому по факту имеем набор названий пакетов и хотим в них найти классы по заданному критерию — в целом вот.
Re: Список классов пакета
От: Vampiro  
Дата: 26.04.08 09:32
Оценка:
Здравствуйте, Бердник Антон, Вы писали:

БА>В сущности задачка очень простая, а сходу найти решения не могу.

БА>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>Кто-нибудь сталкивался с подобной задачей?

я думаю, что в данном случае может помочь java agent, который указывается как jvm аргумент. На его основе построены все профайлеры. Кто сталкивался например с YourKit — тот знает как его навесить. Копните в эту сторону и я думаю это Вам поможет
Re[2]: Список классов пакета
От: Vampiro  
Дата: 26.04.08 09:42
Оценка:
Здравствуйте, Vampiro, Вы писали:

V>Здравствуйте, Бердник Антон, Вы писали:


БА>>В сущности задачка очень простая, а сходу найти решения не могу.

БА>>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>>Кто-нибудь сталкивался с подобной задачей?

V>я думаю, что в данном случае может помочь java agent, который указывается как jvm аргумент. На его основе построены все профайлеры. Кто сталкивался например с YourKit — тот знает как его навесить. Копните в эту сторону и я думаю это Вам поможет


он устанавливается с помощью атрибута

-javaagent

Вам будет необходимо написать класс с методом premain в котором Вы сможете подсчитывать любую статистическую информацию по загружаемым класам.
Вам нужно будет на Instumentation навесить Transformer и в методе transform Вы получите всю необходимую информацию.

Good luck !
Re[3]: Список классов пакета
От: Vampiro  
Дата: 26.04.08 13:40
Оценка:
V>>я думаю, что в данном случае может помочь java agent, который указывается как jvm аргумент. На его основе построены все профайлеры. Кто сталкивался например с YourKit — тот знает как его навесить. Копните в эту сторону и я думаю это Вам поможет

V>он устанавливается с помощью атрибута


V>-javaagent


V>Вам будет необходимо написать класс с методом premain в котором Вы сможете подсчитывать любую статистическую информацию по загружаемым класам.

V>Вам нужно будет на Instumentation навесить Transformer и в методе transform Вы получите всю необходимую информацию.

решил поразвлечся и написал пример

вот код агента:

package com.agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;

public class PackageCounterAgent {

    public static void premain(final String arg, Instrumentation instrumentation) {
        instrumentation.addTransformer(new ClassFileTransformer() {

            public byte[] transform(ClassLoader loader, String className,
                    Class<?> classBeingRedefined,
                    ProtectionDomain protectionDomain, byte[] classfileBuffer)
                    throws IllegalClassFormatException {

                System.out.println("className = " + className);
                System.out.println("classBeingRedefined = " + classBeingRedefined);
                System.out.println("protectionDomain = " + protectionDomain);

                return null;
            }

        });
    }

}


агент должен быть помещен в jar с приведенным ниже манифестом:

Manifest-Version: 1.0
Premain-Class: com.agent.PackageCounterAgent


для запуска необходимо выполнить след.команду:

java -javaagent:PackageCounterAgent.jar com.test.Test


Я создал тестовый проект с одним классом — com.test.Test

вот, что мы получим на выходе программы :

className = com/test/Test
classBeingRedefined = null
protectionDomain = ProtectionDomain  (file:/D:/Projects/Java/Test/bin/ <no signer certificates>)
 sun.misc.Launcher$AppClassLoader@11b86e7
 <no principals>
 java.security.Permissions@14318bb (
 (java.lang.RuntimePermission exitVM)
 (java.io.FilePermission \D:\Projects\Java\Test\bin\- read)
)


я думаю этих данных больше чем достаточно для определения пакета
Re: Список классов пакета
От: vsb Казахстан  
Дата: 26.04.08 15:21
Оценка:
Здравствуйте, Бердник Антон, Вы писали:

БА>В сущности задачка очень простая, а сходу найти решения не могу.

БА>Хочется, зная имя пакета, получить список всех его классов, подпакетов и т.п.
БА>Кто-нибудь сталкивался с подобной задачей?

В Spring есть похожая функциональность: классам ставим аннотацию @Component, в конфиге пишем <context:component-scan base-package="my.package"/>, он при старте их все находит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.