powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Откуда вызов метода в jare
21 сообщений из 21, страница 1 из 1
Откуда вызов метода в jare
    #37739195
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста есть ли средство определить откуда происходит вызов метода - из соседнего в том же jar класса или извне этого jara?
Это нужно для ограничений некоторых функций без лицензии.
То есть внутри jar есть класс InnerClass с методом InnerMethod, который может вызывать и соседний в этом же jare класс, и класс клиента извне jara.
Надо, чтобы класс InnerClass имел возможность распознать, откуда извне или изнутри jara пришел вызов и в зависимости от этого выполнить так или иначе метод InnerMethod.
Есть такие возможности в Java?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739234
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну для этого существуют параметры. А что мешает завести две обертки над этим методом? одну, которую могут вызвать только классы из того же пакета, например с областью видимости default, и вторую - для всех остальных?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739238
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739263
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никДа и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.

А что именно мутноватого? Есть логика метода.
Но
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
     boolen allRight;
     if(вызов изнутри)
     {
          allRight = true;
      }
      else //вызов извне
      {
           if(licensed)
           {
                allRight = true;
            }
            else
            {
                allRight = false;
             }
       }

       if(!allRight)
       {
           restrictFunctionality();
        }



Я схематично изобразил - но суть в этом.
Как это реализовать?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739282
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//доступ вне jar
public void methodOuter(){
       method(true);
}

//доступ из jar, доступен только из пакета
void methodInner(){
      method(false);
}

//метод
private void method(boolean isLicensed){

}
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739285
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonзабыл никДа и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.

А что именно мутноватого? Есть логика метода.
Но
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
     boolen allRight;
     if(вызов изнутри)
     {
          allRight = true;
      }
      else //вызов извне
      {
           if(licensed)
           {
                allRight = true;
            }
            else
            {
                allRight = false;
             }
       }

       if(!allRight)
       {
           restrictFunctionality();
        }



Я схематично изобразил - но суть в этом.
Как это реализовать?

Суть в том, что если вам надо реализовать логику в зависимости от внешнего условия, надо в метод передать параметр.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739295
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никДа и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.
В стандартных библиотеках нередко анализируется право доступа к тому или иному ресурсу со стороны текущего thread'a с помощью SecurityManager'a.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739321
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Class.getProtectionDomain().getCodeSource()....

такое штоль?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37739367
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reflection.getCallerClass() + .getProtectionDomain().getCodeSource()
Ещё почитайте про sealed jar, возможно чем-то пригодится.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37740642
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread.currentThread().getStackTrace()
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37740678
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokThread.currentThread().getStackTrace()
Разворачиваение всего stack trace достаточно накладная операция. Поэтому, если очень надо, лучше таки использовать внутренний API hotspot.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37740765
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторРазворачиваение всего stack trace достаточно накладная операция

А где это написано? Или это выведено экспериментально?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37741065
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokА где это написано? Или это выведено экспериментально?
Это очевидно, если знать как стек работает.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37741802
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как работает стек, согласно вашим представлениям?

Я вот не знаю (но догадываюсь) как он работает в жаве, но знаю как он работает в х86 и как его используют компиляторы С. Но я уверен, что в жаве (исходя из того, что сегодняшним жава-машинам уже далеко до говнокода) стек вызовов, видимый через getStackTrace() работает несколько иначе - обратные адреса не перемежаются с переменными, поэтому стек вызовов тупо представляет из себя набор StackTraceElement или некоторых структур, которые легко проебразовать в StackTraceElement. getStackTrace() тупо копирует их в массив.

И я не вижу особо накладных действий при разворачивании стека, хотя конечно все относительно. Единственный недостаток - это то что getStackTrace() копирует весь стек, который при большой глубине вызовов теоретически может быть довольно большим. На практике он обычно не очень большой.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37741819
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokНа практике он обычно не очень большой.
Ага. Практически никогда не бывает:
http://rsdn.ru/forum/humour/1973177.1.aspx
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37741838
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а я что говорю?
Загрузили что-то весьма большое и получили размер стека гораздо меньше 1кб. Я посчитал, там около 100записей.

а если учесть, что анализировать его как правило надо на уровне бизнес-логики - смело вычитаем 20%

Приложению приходится отводить по умолчанию 4мб и даже больше потому, что некоторые индивиды страдают болезнью под названием рекурсия головного мозга.
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37741853
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Ваша взяла. Хотя и разница между Unsafe и getStacktrace() огромная, в целом, производительность на современно железе не просядет.

10К вызовов
new Throwable().getStackTrace()[0].getClassName();

0.659870019 sec - 100 stack elements
1.913367376 sec - 300 stack elements

Reflection.getCallerClass(0).getClass().getName();
0.012597774 sec - 100 stack elements
0.015731135 sec - 300 stack elements
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37742168
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мдя.
взяла все же ваша :))
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37745662
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли проверять вызов внешний или внутренний таким способом -
например у меня все классы в пределах com.megacompany
В методе, который вызывается, получаю имя вызывающего класса
Если вижу, что пакет не com.megacompany, то сразу обозначаю вызов как внешний.
Если же пакет соответствует com.megacompany , то проверяю не сделал ли клиент свои классы в том же пакете -
беру имя класса и сравниваю со списком имен моих классов.
Насколько я понимаю,установить в одном classpath 2 класса с одинаковым полным именем нельзя.Правильно?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37745961
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что показывает метод boolean isNativeMethod() класса StackTraceElement?
...
Рейтинг: 0 / 0
Откуда вызов метода в jare
    #37764637
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Натиный метод - это тот, который исполняется не жавамашиной. Например, в dll-ке под виндой или в so-шнике под линуксом.

А вот у меня вопрос. Имя вызвавшего класса мы научились узнавать. Как получить объект, если вызов был не из статического метода?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Откуда вызов метода в jare
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]