正确使用反射以获得Class方法

时间:2018-12-12 19:28:39

标签: android reflection

我尝试实施issue 111316656的项目#11中提出的建议:

  

您还应该能够使用反射来访问支持fab的FloatingActionButtonImpl,然后在该实例上调用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 :(得分:0)

在这里尝试

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;
  }

答案 1 :(得分:0)

在Mike M.的帮助下(请参阅问题中的注释),这是所引用问题中包含的解决方法的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();
                    }
                }
            });