1. Java / Говнокод #7797

    +75

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    try {
        Method m = this.getClass().getMethod("setLayerType", int.class, Paint.class);
        if (m != null) {
            m.invoke(this, View.LAYER_TYPE_SOFTWARE, (Object)null);
        }
    } catch (NoSuchMethodException e) {
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    }

    Моему коллеге пришлось писать _такое_ только потому, что заказчик не захотел форкнуть проект на две отдельных ветки, для Android 2.3 и для 3.2.

    Запостил: wildscliss, 07 Сентября 2011

    Комментарии (13) RSS

    • > int.class
      что-что? класс примитива?
      Ответить
      • Я думаю тут имелась ввиду рефлексия getMethod("setLayerType"....); m.invoke(...);
        Ответить
        • вот я думаю, не скомпилица или всё же додумается сделать автобоксинг?
          Ответить
      • Да, в Java у примитивов есть объекты Class. И они, о ужас, не совпадают с объектами Class для обёрток.

        То есть int.class != Integer.class, но int.class == Integer.TYPE.
        Ответить
    • Заказчик прав.
      Ответить
    • Поясните, пожалуйста, как связана необходимость работы на разных версиях Android с необходимостью делать рефлексивный вызов метода разрабатываемого _вами_ класса?
      Ответить
      • в 2.3 скорее всего нет метода setLayerType(...), а компилять приходится с либами как раз-таки 2.3.
        Ответить
        • this.getClass().getMethod()
          Наверное, наследуются от какого-то графического контрола
          Ответить
    • Кстати, а зачем проверять m на null (3 строчка)? Если метода не существует, кинется NoSuchMethodException, если существует - он не null. Если чудеса таки бывают, лучше уж словить NullPointerException.
      Ответить

    Добавить комментарий