Как делает один доступ метод от внешней банки во времени выполнения?

Ваша конечная цель должна распространиться к большей базе пользователей, кто добирается для покупки материала.

, Что, если Вы сделали что-то как выпуск Ваших мешков w00t в течение часа или два, и по диапазону IP-адресов, вместо того, чтобы выпустить их всех одновременно и к какому-либо IP-адресу.

Скажем, у Вас есть 255 мешков w00t. 1.0.0.0 может купить на первой минуте, 2.0.0.0 может купить на второй минуте (потенциально 2 мешка доступных w00t), и т.д., и т.д.

Затем после 255 минут, Вы сделали мешки w00t доступными всем, хотя очень вероятно, что не все 255 мешков w00t оставляют.

Это ограничивает истинное нападение пользователями, которые имеют> 255 компьютеров, хотя пользователь бота смог "владеть" мешком w00t, присвоенного их диапазону IP.

нет никакого требования, чтобы Вы подошли сумки к IP справедливо (и определенно необходимо использовать некоторый тип MD5 / случайная вещь семени)..., если Вы распределяете 10 мешков w00t инкрементно, просто необходимо удостовериться, что это распределяется ~evenly ~ через население.

, Если IP плох затем, можно использовать cookie и исключить вариант использования, где non-cookied пользователю предлагают мешок w00t.

, Если Вы замечаете, что конкретный IP, cookie или диапазон адресов имеют экстремальный объем трафика, делают мешок w00t доступным им пропорционально позже / в последний раз, так, чтобы случайный / устойчивый / замедлились, посетителям дают возможности прежде тяжелый / быстрый / вероятные пользователи бота.

- Robert

6
задан Community 23 May 2017 в 10:30
поделиться

2 ответа

Вот код отражения, который не приводится к интерфейсу:

public class ReflectionDemo {

  public void print(String str, int value) {
    System.out.println(str);
    System.out.println(value);
  }

  public static int getNumber() { return 42; }

  public static void main(String[] args) throws Exception {
    Class<?> clazz = ReflectionDemo.class;
    // static call
    Method getNumber = clazz.getMethod("getNumber");
    int i = (Integer) getNumber.invoke(null /* static */);
    // instance call
    Constructor<?> ctor = clazz.getConstructor();
    Object instance = ctor.newInstance();
    Method print = clazz.getMethod("print", String.class, Integer.TYPE);
    print.invoke(instance, "Hello, World!", i);
  }
}

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

3
ответ дан 17 December 2019 в 02:31
поделиться

В примере кода

ClassLoader loader = URLClassLoader.newInstance(
    new URL[] { yourURL },
    getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
doRun.run();

предполагается что загружаемый вами класс реализует определенный интерфейс Runnable, и поэтому разумно привести его к этому типу с помощью asSubclass () и вызвать run ().

Что вы знаете о загружаемых классах? Можете ли вы предположить, что они реализуют особый интерфейс? Если это так, отрегулируйте строку asSubClass () так, чтобы она ссылалась на то, что вы предпочитаете.

Тогда, да, если вы работаете с методами экземпляра, создайте экземпляр с помощью конструктора, ctor в примере.

Там в примере нет запуска потока. Для создания нового потока просто потребовалось бы на пару строк больше кода

Thread myThread = new Thread(doRun);
myThread.start();
2
ответ дан 17 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

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