Как Анонимные внутренние классы используются в Java?

Существует множество способов предотвращения SQL-инъекций и других SQL-хаков. Вы можете легко найти его в Интернете (Google Search). Конечно, PDO - одно из хороших решений. Но я хотел бы предложить вам некоторые хорошие ссылки с помощью SQL Injection.

Что такое SQL-инъекция и как предотвратить

Руководство PHP для SQL-инъекция

Microsoft объяснение SQL-инъекции и предотвращения в PHP

и некоторые другие, подобные Предотвращение SQL-инъекций с MySQL и PHP

Теперь, почему вам нужно предотвратить запрос из SQL-инъекции?

Я хотел бы сообщить вам: почему мы пытаемся предотвратить SQL-инъекцию с помощью Ниже приведен короткий пример:

Запрос для проверки подлинности входа:

$query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";

Теперь, если кто-то (хакер) помещает

$_POST['email']= admin@emali.com' OR '1=1

и пароль что-либо ....

Запрос будет анализироваться в системе только до:

$query="select * from users where email='admin@emali.com' OR '1=1';

Другая часть будет отброшена. Итак, что будет? Неавторизованный пользователь (хакер) сможет войти в систему как администратор без своего пароля. Теперь он может делать все, что может сделать администратор / адрес электронной почты. См., Очень опасно, если SQL-инъекция не предотвращается.

303
задан Paolo Forgia 14 April 2019 в 23:40
поделиться

6 ответов

"Анонимным классом" я беру его, Вы имеете в виду анонимный внутренний класс .

, анонимный внутренний класс может прибыть полезный при создании экземпляра объекта с определенными "отдельно оплачиваемыми предметами", такими как методы переопределения, не имея необходимость на самом деле разделять класс на подклассы.

я склонен использовать его в качестве ярлыка для присоединения слушателя события:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});

Используя этот метод делает кодирование немного более быстрым, поскольку я не должен делать дополнительный класс, который реализует ActionListener - я могу просто инстанцировать анонимного внутреннего класса, на самом деле не делая отдельный класс.

я только использую эту технику для "быстрых и грязных" задач, где создание всего класса чувствует себя ненужным. При наличии нескольких анонимных внутренних классов, которые делают точно, то же самое должно быть пересмотрено к фактическому классу, быть им внутренний класс или отдельный класс.

362
ответ дан Pool 23 November 2019 в 01:23
поделиться

Да, анонимные внутренние классы определенно одно из преимуществ Java.

С анонимным внутренним классом у Вас есть доступ к финалу и членским переменным окружающего класса, и это пригождается в слушателях и т.д.

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

5
ответ дан Lars A Frøyland 23 November 2019 в 01:23
поделиться

Вы используете его в ситуациях, где необходимо создать класс для определенной цели в другой функции, например, как слушатель, как выполнимое (для порождения потока), и т.д.

, идея состоит в том, что Вы называете их из кода функции, таким образом, Вы никогда не обращаетесь к ним в другом месте, таким образом, Вы не должны называть их. Компилятор просто перечисляет их.

Они - чрезвычайно синтаксический сахар и должны обычно перемещаться в другое место, поскольку они становятся больше.

я не уверен, является ли это одно из преимуществ Java, хотя при использовании их (и все мы часто используем их, к сожалению), тогда Вы могли утверждать, что они - тот.

8
ответ дан Uri 23 November 2019 в 01:23
поделиться

Они являются наиболее часто используемыми как подробная форма обратного вызова.

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

Вот пример колебания

myButton.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        // do stuff here...
    }
});

, Хотя это является все еще грязно подробным, это намного лучше, чем то, чтобы вынуждать Вас определить именованный класс для каждого выбрасывать слушателя как это (хотя в зависимости от ситуации и повторного использования, которое может все еще быть лучшим подходом)

18
ответ дан madlep 23 November 2019 в 01:23
поделиться

Я иногда использую их в качестве взлома синтаксиса для инстанцирования Карты:

Map map = new HashMap() {{
   put("key", "value");
}};

по сравнению с

Map map = new HashMap();
map.put("key", "value");

Это сохраняет некоторое дублирование при выполнении большого количества помещенных операторов. Однако я также столкнулся с проблемами, делающими это, когда внешний класс должен быть сериализирован через дистанционную работу.

46
ответ дан user207421 23 November 2019 в 01:23
поделиться

Анонимные внутренние классы являются эффективно закрытиями, таким образом, они могут использоваться для эмуляции лямбда-выражений или "делегатов". Например, возьмите этот интерфейс:

public interface F<A, B> {
   B f(A a);
}

можно использовать это анонимно для создания первоклассная функция в Java. Скажем, у Вас есть следующий метод, который возвращает первое число, больше, чем я в данном списке или мне, если никакое число не больше:

public static int larger(final List<Integer> ns, final int i) {
  for (Integer n : ns)
     if (n > i)
        return n;
  return i;
}

И затем у Вас есть другой метод, который возвращает первое число, меньшее, чем я в данном списке или мне, если никакое число не меньше:

public static int smaller(final List<Integer> ns, final int i) {
   for (Integer n : ns)
      if (n < i)
         return n;
   return i;
}

Эти методы почти идентичны. Используя первоклассный функциональный тип F, мы можем переписать их в один метод следующим образом:

public static <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) {
   for (T t : ts)
      if (f.f(t))
         return t;
   return z;
}

можно использовать анонимный класс для использования firstMatch метода:

F<Integer, Boolean> greaterThanTen = new F<Integer, Boolean> {
   Boolean f(final Integer n) {
      return n > 10;
   }
};
int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);

Это - действительно изобретенный пример, но ее легкое, чтобы видеть, что способность раздать функции, как будто они были значениями, является довольно полезной функцией. См. , "Может Ваш Язык программирования Делать Это" самим Joel.

А хорошая библиотека для программирования Java в этом стиле: Функциональный Java.

73
ответ дан 3 revs, 2 users 97% 23 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: