Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста наследоваться от класса DatagramSocket / 7 сообщений из 7, страница 1 из 1
27.08.2020, 16:53
    #39993064
Mandarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста наследоваться от класса DatagramSocket
Всем привет! Подскажите пожалуйста как правильно наследоваться от класса 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
27.08.2020, 17:07
    #39993067
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста наследоваться от класса DatagramSocket
Чудесный мир ООП.

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

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

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


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