правильное использование отражения, чтобы получить метод класса - PullRequest
0 голосов
/ 12 декабря 2018

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

Вы также должны иметь возможность использовать отражение, чтобы получить доступ к поддержке FloatingActionButtonImpl.fab, а затем вызовите setImageMatrixScale (1) для этого экземпляра.

со следующим кодом:

            FloatingActionButton fab;
            ...    
            Method method = null;
            try {
                method = fab.getClass().getMethod("setImageMatrixScale", null);
                method.invoke(fab, 1);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

Но значение NoSuchMethodException повышено.В чем проблема?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

С помощью Майка М. (см. Комментарии в вопросе) это версия обходного пути JAVA, включенная в упомянутую проблему:

            fab.show(new FloatingActionButton.OnVisibilityChangedListener() {
                @Override
                public void onShown(FloatingActionButton fab) {
                    try {
                        Field implField = FloatingActionButton.class.getDeclaredField("impl");
                        implField.setAccessible(true);
                        Object impl = implField.get(fab);
                        Class cls;
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            cls = impl.getClass().getSuperclass();
                        } else {
                            cls = impl.getClass();
                        }
                        Method mthd = cls.getDeclaredMethod("setImageMatrixScale", Float.TYPE);
                        mthd.setAccessible(true);
                        mthd.invoke(impl, 1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
0 голосов
/ 12 декабря 2018

Попробуйте как здесь

BluetoothGatt localBluetoothGatt = gatt;
  java.lang.reflect.Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
  if (localMethod != null) {
    boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
    return bool;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...