powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста наследоваться от класса DatagramSocket
7 сообщений из 7, страница 1 из 1
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993064
Фотография Mandarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет! Подскажите пожалуйста как правильно наследоваться от класса DatagramSocket?
Мне нужно переопределить метод send, выкинуть от туда всё лишнее.
Что я делаю:
1. Создаю класс наследник MyDatagramSocket extends DatagramSocket
2. Переопределяю метод send,
Код: java
1.
2.
3.
@Override
    public void send(DatagramPacket p) throws IOException {
    }


3. Смотрю нативный метод send
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public void send(DatagramPacket p) throws IOException  {
        InetAddress packetAddress = null;
        synchronized (p) {
            if (isClosed())
                throw new SocketException("Socket is closed");
            checkAddress (p.getAddress(), "send");
            if (connectState == ST_NOT_CONNECTED) {
                // check the address is ok wiht the security manager on every send.
                SecurityManager security = System.getSecurityManager();

                // The reason you want to synchronize on datagram packet
                // is because you don't want an applet to change the address
                // while you are trying to send the packet for example
                // after the security check but before the send.
                if (security != null) {
                    if (p.getAddress().isMulticastAddress()) {
                        security.checkMulticast(p.getAddress());
                    } else {
                        security.checkConnect(p.getAddress().getHostAddress(),
                                              p.getPort());
                    }
                }
            } else {
                // we're connected
                packetAddress = p.getAddress();
                if (packetAddress == null) {
                    p.setAddress(connectedAddress);
                    p.setPort(connectedPort);
                } else if ((!packetAddress.equals(connectedAddress)) ||
                           p.getPort() != connectedPort) {
                    throw new IllegalArgumentException("connected address " +
                                                       "and packet address" +
                                                       " differ");
                }
            }
            // Check whether the socket is bound
            if (!isBound())
                bind(new InetSocketAddress(0));
            // call the  method to send
            getImpl().send(p);
        }
    }


4. Хочу оставить только последнюю строку, в методе send, getImpl().send(p);
5. Смотрю метод getImpl()
Код: java
1.
2.
3.
4.
5.
DatagramSocketImpl getImpl() throws SocketException {
        if (!created)
            createImpl();
        return impl;
    }


6. Смотрю класс DatagramSocketImpl, вижу что там есть метод send и он определён так
Код: java
1.
protected abstract void send(DatagramPacket p) throws IOException;


Из этого я понимаю, что вызвать его можно только из класса наследника от DatagramSocketImpl
7. Соответственно я не могу его вызвать из своего класса, да и как он вызывается из DatagramSocket тоже не понятно, потому как DatagramSocket описан так
Код: java
1.
2.
public
class DatagramSocket implements java.io.Closeable 


8. Я попробовал добраться до этого метода через reflection
Код: java
1.
2.
3.
    Method send;        
send = DatagramSocketImpl.class.getDeclaredMethod("send", DatagramPacket.class);
        send.setAccessible(true);


получилось, могу отправить. Но я не хочу это делать через reflection потому как это долго. Хочу вызывать этот метод напрямую.
Подскажите пожалуйста как правильно наследоваться от DatagramSocket, так, чтобы можно было вызывать метод DatagramSocketImpl .send(DatagramPacket p).
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993067
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудесный мир ООП.

Извини, бедняга, я бы мог попробовать помочь, но пока времени нету. Сочувствую, без сарказма
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993069
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mandarin,
Что толку наследовать, если у тебя экземпляр базового класса должен быть как в проде. Проинициализирован и т.д.
То есть вместо
var v = new DatagramSocket()
Ты должен подставить
var v = new MyDatagramSocket()
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993071
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
Тогда getImpl вызовется у базового класса.
Ты же его не перекрывал?
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993072
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наследник дополняет базовый класс. Это значит что нельзя оторвать базовый класс Паровоз от контекста и наследовать его в Ракета.
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993076
Фотография Mandarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Он может не только дополнять, но и изменять поведение.
...
Рейтинг: 0 / 0
Помогите пожалуйста наследоваться от класса DatagramSocket
    #39993079
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mandarin
PetroNotC Sharp,

Он может не только дополнять, но и изменять поведение.
ну не кардинально же)))) LOL
Пол изменить нельзя! Даже если можно)))
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста наследоваться от класса DatagramSocket
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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