Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вызов метода из другого пакета, не знаю как сделать 
:(
    Опции темы
Escorial
Дата 28.8.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2012

Репутация: нет
Всего: нет



есть class A extends C { void f(){...} } А и С в одном пакете без модификаторов, есть class B { void g(){....} }  в другом пакете без модификатора. как вызвать метод g() внутри метода f(). возможно любое решения кроме установления другого модификатора доступа.

еще вопрос (класс А такой же как и в первом вопросе): class B extend A { void h(){....} } они теперь в одном пакете - как в f() вызвать h()... можно делать все что хочешь...

везде пытался отыскать ответ - но найти не могу, подскажите.
данный вопрос был на собеседовании.
PM MAIL   Вверх
k0rvin
Дата 28.8.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Прикольно, режим доступа private (который также используется поумолчанию, если никакой модификатор не указан) для того и был придуман, чтобы не позволять обращаться к таким данным извне, а его почему-то пытаются обойти, за такое по идее нужно бить палкой по рукам.

А так, через рефлексию вроде можно, гугл в помощь.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Karadul
Дата 28.8.2012, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



По умолчанию protected же?
PM MAIL   Вверх
Stolzen
Дата 28.8.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 3
Всего: 48



Цитата(Karadul @  28.8.2012,  16:23 Найти цитируемый пост)
По умолчанию protected же? 

Нет, правильнее будет назвать package-private, protected несколько шире


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Escorial
Дата 28.8.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2012

Репутация: нет
Всего: нет



По умолчанию внутри пакета, без доступа наследникам.
Вообщем спасибо, что откликнулись буду дальше искать.
PM MAIL   Вверх
Pawl
Дата 2.9.2012, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Честно, не совсем понял, зачем класс А должен быть наследником С, ну да ладно. Вот каким может быть ответ на первую часть Вашего вопроса:
Код

package a;

class C {
    void f() {
        System.out.println("in C");
    }
}

Код

package b;

public class B {
    void g() {
        System.out.println("in B");
    } 
}

Код

package a;

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import b.B;

class A extends C {
    void f() {
        B bb = new B();
        try {
            Method privatG = B.class.getDeclaredMethod("g");
            privatG.setAccessible(true);        
            privatG.invoke(bb);
        } catch (IllegalAccessException | InvocationTargetException | IllegalArgumentException |
                NoSuchMethodException e) {
            System.out.println(e.getMessage());
        }        
    }
    
    public static void main(String[] args) {
        new A().f();
    }
}
По-поводу второй части вопроса. Если можно делать "все, что хочешь", то в чем же тогда проблема? 



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Escorial
Дата 3.9.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2012

Репутация: нет
Всего: нет



спасибо за ответ. я не знаю будет ли работать класс А если убрать public модификатор у класса В, так как вся проблема и касалась того, как обойти модификатор доступа.
PM MAIL   Вверх
Pawl
Дата 3.9.2012, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(Escorial @  3.9.2012,  13:59 Найти цитируемый пост)
я не знаю будет ли работать класс А если убрать public модификатор у класса В,

мда, не будет... Строчку с названием и сигнатурой метода в этом случае получить можно так:
Код

class A extends C {
    void f() {
        try {
            Method privatG = Class.forName("b.B").getDeclaredMethod("g");
            privatG.setAccessible(true);        
            System.out.println(privatG.toGenericString());
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }

А как этот метод вызвать... Сдаюсь! smile
Вот, пришла в голову мысль: а в ТЗ ничего не было сказано про модификатор доступа конструктора класса В? Если сделать в В public-конструктор, вызвать его метод g можно так:
Код

package b;

class B {
    public B() {
    }
    
    void g() {
        System.out.println("aha!");
    } 
}

Код

package a;

import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

class A extends C {
    void f() {
        try {
            Constructor constrB = Class.forName("b.B").getConstructor();
            constrB.setAccessible(true);
            Method privatG = Class.forName("b.B").getDeclaredMethod("g");
            privatG.setAccessible(true);
            privatG.invoke(constrB.newInstance());    
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }
    
    public static void main(String[] args) {
        new A().f();
    }
}


Это сообщение отредактировал(а) Pawl - 3.9.2012, 22:01


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Escorial
Дата 7.9.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2012

Репутация: нет
Всего: нет



возможно вы правы. просто тогда находит мысль - зачем все это делать - не легче тогда сделать класс публичный?)) - вообщем я насчет этих вопросов себе создал мысль - что люди просто хотят поднять статус собеседования - задавая каверзные вопросы - решения которых смысла не имеет)
Спасибо за ответ и помощь - буду для себя знать что можно с помощью интерфесов Conctructor и Method получить напрямую доступ к конструктору и методу н есоздавая обьект класса. - если я правильно понял то что вы предлдожили.
PM MAIL   Вверх
Pawl
Дата 8.9.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(Escorial @  7.9.2012,  12:49 Найти цитируемый пост)
Спасибо за ответ и помощь - буду для себя знать что можно с помощью интерфесов Conctructor и Method получить напрямую доступ к конструктору и методу н есоздавая обьект класса.

Не за что smile  На самом деле, объект класса для вызова его метода все-же создается. Обратите внимание на строку:
Код

constrB.newInstance();

Цитата

Uses the constructor represented by this Constructor object to create and initialize a new instance of the constructor's declaring class

В java нельзя вызвать метод класса, не создавая объект этого класса, если, конечно, этот метод не static.

Это сообщение отредактировал(а) Pawl - 8.9.2012, 10:40


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Escorial
Дата 10.9.2012, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2012

Репутация: нет
Всего: нет



Спасибо за уточнение:)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.