Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Откуда вызов метода в jare / 21 сообщений из 21, страница 1 из 1
04.04.2012, 20:06:16
    #37739195
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Подскажите пожалуйста есть ли средство определить откуда происходит вызов метода - из соседнего в том же jar класса или извне этого jara?
Это нужно для ограничений некоторых функций без лицензии.
То есть внутри jar есть класс InnerClass с методом InnerMethod, который может вызывать и соседний в этом же jare класс, и класс клиента извне jara.
Надо, чтобы класс InnerClass имел возможность распознать, откуда извне или изнутри jara пришел вызов и в зависимости от этого выполнить так или иначе метод InnerMethod.
Есть такие возможности в Java?
...
Рейтинг: 0 / 0
04.04.2012, 20:57:30
    #37739234
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Ну для этого существуют параметры. А что мешает завести две обертки над этим методом? одну, которую могут вызвать только классы из того же пакета, например с областью видимости default, и вторую - для всех остальных?
...
Рейтинг: 0 / 0
04.04.2012, 20:59:15
    #37739238
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Да и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.
...
Рейтинг: 0 / 0
04.04.2012, 21:24:30
    #37739263
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
забыл никДа и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.

А что именно мутноватого? Есть логика метода.
Но
Код: 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
04.04.2012, 21:42:03
    #37739282
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Код: 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
04.04.2012, 21:44:51
    #37739285
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
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
04.04.2012, 21:52:34
    #37739295
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
забыл никДа и странно как-то не находите, логика метода зависит не от объекта, на котором вызывается метод, а от того, кто его вызывает? Мутновато это.
В стандартных библиотеках нередко анализируется право доступа к тому или иному ресурсу со стороны текущего thread'a с помощью SecurityManager'a.
...
Рейтинг: 0 / 0
04.04.2012, 22:27:19
    #37739321
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Class.getProtectionDomain().getCodeSource()....

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

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

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

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

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

Приложению приходится отводить по умолчанию 4мб и даже больше потому, что некоторые индивиды страдают болезнью под названием рекурсия головного мозга.
...
Рейтинг: 0 / 0
06.04.2012, 13:23:36
    #37741853
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
ОК. Ваша взяла. Хотя и разница между 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
06.04.2012, 15:42:12
    #37742168
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
мдя.
взяла все же ваша :))
...
Рейтинг: 0 / 0
09.04.2012, 18:37:38
    #37745662
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Можно ли проверять вызов внешний или внутренний таким способом -
например у меня все классы в пределах com.megacompany
В методе, который вызывается, получаю имя вызывающего класса
Если вижу, что пакет не com.megacompany, то сразу обозначаю вызов как внешний.
Если же пакет соответствует com.megacompany , то проверяю не сделал ли клиент свои классы в том же пакете -
беру имя класса и сравниваю со списком имен моих классов.
Насколько я понимаю,установить в одном classpath 2 класса с одинаковым полным именем нельзя.Правильно?
...
Рейтинг: 0 / 0
09.04.2012, 23:29:57
    #37745961
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Что показывает метод boolean isNativeMethod() класса StackTraceElement?
...
Рейтинг: 0 / 0
21.04.2012, 19:07:48
    #37764637
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откуда вызов метода в jare
Натиный метод - это тот, который исполняется не жавамашиной. Например, в dll-ке под виндой или в so-шнике под линуксом.

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


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