2014-08-30 3 views
0

Недавно я выполнил исходный код adw-launcher, некоторые из классов этого проекта используют защищенную переменную классов android. Ниже приведен фрагмент кода:Доступ к защищенной переменной класса android

@Override 
    protected boolean setFrame(int left, int top, int right, int bottom) { 
     if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) { 
      mBackgroundSizeChanged = true; 
     } 
     return super.setFrame(left, top, right, bottom); 
    } 

mLeft, mRight все защищены.

Как это сделать? Я полностью в этом нуждаюсь, вам нужно руководствоваться.

Я пошел по этой ссылке: How do I build the Android SDK with hidden and internal APIs available?

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

Благодаря

ответ

0

Вы можете использовать мощный (и опасный) Reflection API из Java на свой страх и риск!

try { 
     Field field = TargetClass.class.getDeclaredField(fieldName); 
     field.setAccessible(true); 

     result = field.get(targetObject); 

     field.setAccessible(false); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 

, чтобы получить результат как int:

int result = field.getInt(targetObject); 
0

Вы не можете получить доступ к protected пользователей за пределами своих пакетов - это дизайн Ява.

Возможно, вы сможете получить к нему доступ с использованием отражения Java, но это не рекомендуется.

Field[] f = ClassName.getClass().getDeclaredFields(); 

Тогда просто f[i].setAccessible(true), чтобы вы могли читать от них. Но это определенно нецелесообразно, если это действительно не нужно.

+0

Но тогда как они скомпилируют источник? Например, они использовали переменную вида mleft, которая защищена. Я обновил квест. – viv

+0

@viv Извините, я просто не уверен, что вы просите здесь. Так вы получаете доступ к защищенным переменным других классов с отражением (хотя и довольно опасным образом). Что вам нужно знать? – Zyerah

+0

Вышеприведенный фрагмент кода относится к классу, который расширяет TextView еще затмение, показывая ошибку. – viv

0

Скрытые классы SDK для Android доступны только для приложений/кода уровня. Вам необходимо связать framework.jar и framework2.jar с кодом для доступа к скрытым API. Но тогда ваше приложение может поднять Security Exception во время выполнения.

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

+0

Вы хорошо поняли мой вопрос, даже если я скомпилировал эти банки, переменные все равно будут защищены? – viv

+0

Защищенные переменные могут быть доступны только подклассам. Вам нужно наследовать от этого класса, который имеет эти переменные. –

Смежные вопросы