Articles of reflection

Androidreflection方法错误

我试图用这个Android类找出Reflection: Class c = Class.forName(“com.android.internal.widget.LockPatternUtils”); Method method = c.getDeclaredMethod(“getKeyguardStoredPasswordQuality”); method.setAccessible(true); Object object = method.invoke(c); // Error with this line result = object.toString()); getKeyguardStoredPasswordQuality方法声明为(无参数): public int getKeyguardStoredPasswordQuality() { // codes here } 我得到的错误是: Exception: java.lang.IllegalArgumentException: expected receiver of type com.android.internal.widget.LockPatternUtils, but got java.lang.Class 如何将com.android.internal.widget.LockPatternUtils声明为接收器?

设置文本时TextView保存资源ID

最初我想创建一个库来轻松更改区域设置,而无需重新创建活动以使更改生效。 为此,我想将setText(int resId)方法的resId存储在一个variables中,以便通过此ID从另一个语言环境重新设置文本。 问题是setText(int resId)在TextVIew中是final的。 所以我的问题是,如果有一种方法来覆盖最终方法(我认为没有),或者添加一些钩子,那么只要调用这个方法,我就能得到这个resId ? 我还要添加我尝试过的内容: 首先我考虑使用InvocationHandler ,因此我可以创建一个TextView实例作为我的类的字段,并将除了setText之外的所有调用传递给它。 但不幸的是我无法在构造函数中返回任何内容。 然后我考虑通过创建一个扩展View的类来实现一个Decorator模式,并拥有TextView所有的所有方法,并创建一个TextView实例作为我的类的一个字段,并以同样的方式传递所有方法调用它,但它不应该有两个原因: 需要TextView实例的方法不起作用,因为我的类不会扩展TextView TextView的实现长度为11969行,复制所有方法需要花费很多时间。

Java自定义注释和动态加载

我正在尝试开发用于数据库同步的ORM,并决定将Javareflection放在一边。 我有一个库定义了这样的同步注释 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited public @interface Synchronised { String tableName(); SynchronisationType synchronisationType(); } 在android项目中,我使用此注释来标记模型类 @Synchronised(tableName=”UserAccounts”, synchronisationType=SynchronisationType.DownloadOnly) public class UserAccount { @SynchronisedField(fieldName=”CompanyFk”) private int companyId; @SynchronisedField(fieldName=”Id”) private int userId; @SynchronisedField(fieldName=”Username”) private String username; @SynchronisedField(fieldName=”Password”) private String password; @SynchronisedField(fieldName=”Salt”) private String salt; @SynchronisedField(fieldName=”IsLocked”) private boolean isLocked; @SynchronisedField(fieldName=”HasMobileAccess”) private boolean hasMobileAccess; } 经过一番调查后,最终编写了一个“loader”方法,允许在当前的apk中发现模型类。 它应该检索所有标记为“已同步”的类,但这里的问题是getAttribute(Synchronised.class)不起作用。 手动迭代注释并搜索属性(instanceof等)也不起作用。 调试时我注意到来自reflection的注释实际上是一个代理(getClass()给出“类Proxy2”,而annotation.AnnotationType()返回正确的名称) – […]

这被认为是反思,到了什么程度?

我有一个Android应用程序(java),使用Android.provider.Contacts类中的以下代码使用Android 1.6 SDK编译时工作正常: Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL; 当2.0 SDK问世时,android.provider.Contacts类被折旧并替换为android.provider.ContactsContract。 为了让一个程序在1.6和2.0上工作,我在1.6下编译并进行了以下更改: Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL; … try { Class c = Class.forName(“android.provider.ContactsContract$PhoneLookup”); baseUri = (Uri) c.getField(“CONTENT_FILTER_URI”).get(baseUri); } catch (Exception e) { } 由于我在1.6下编译,我无法导入android.provider.ContactsContract,因为它是一个只知道2.0的类。 这被认为是反思,到了什么程度? 补充说明:在阅读“Java编程语言”的“反思”章节后(我本来应该先做),我现在大部分都了解你可以用reflection做些什么,但反思的简洁定义并不容易。 你的答案有助于澄清是什么引发了我的问题 – 一旦反映了一个类,并且使用reflection创建了一个类的实例,你就可以与实例交互,好像这个类是新的一样。 这是我对简明定义的微薄尝试,这种定义远非完美,我相信我需要修改,因为我了解更多: reflection是使用java.lang.reflect中包含的类对象或需要最初使用完全限定的字符串名称访问类的类或包类的类对象的间接动态查询,操作或调用。

防止reflection – 安卓

甚至可以通过使用setAccessible(true)reflection来访问我的类的私有成员/函数。 有没有办法阻止外部代码的这种访问? 我读了一些关于堆栈溢出的东西,我可以使用SecurityManager来防止applet中的reflection(虽然不知道它是如何工作的),但是Android也有类似的机制吗? 也许是注释或聪明的编程?

如何从该方法中获取方法名称?

我正在尝试创建一个从该方法返回方法名称的函数: public static String getMethodName(final int depth) { final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); return ste[ste.length – 1 – depth].getMethodName(); } 但是,当我从Activity.onCreate()调用此方法时,它返回“main”而不是“onCreate”。 如何从该方法中获取实际方法名称?

如何使用reflection来更改备份服务?

我发布了一个关于Android 5.1的新行为的问题 ,该行为在设备上设置设备所有者时会禁用备份服务… 一个可能的解决方案可能是(我猜)使用reflection来解决问题:我可以在隐藏类中使用特定方法find一些reflection示例,但这种情况看起来更复杂,使用另一个隐藏类(ServiceManager)的构造函数我不知道如何做到这一点…… 令我烦恼的代码位于第3739至3749行的DevicePolicyManagerService.java(可在此处find): long ident = Binder.clearCallingIdentity(); try { IBackupManager ibm = IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); ibm.setBackupServiceActive(UserHandle.USER_OWNER, false); } catch (RemoteException e) { throw new IllegalStateException(“Failed deactivating backup service.”, e); } finally { Binder.restoreCallingIdentity(ident); } 我的目标是重新启用备份服务,理想情况下,这将调用类似于: ibm.setBackupServiceActive(UserHandle.USER_OWNER, false); 你能帮帮我吗?

Android测试:对话。 检查它是显示()

这是我的方法,它工作正常,并显示对话框。 public void showDialog(){ final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.mylayout); dialog.show(); } 我有一个测试项目,我想测试Dialog是否出现。 我想应用.isShowing()方法。 这样的东西…… assertTrue(dialog.isShowing()); 但我不知道如何在我的测试中find对话框variables。 我没有使用Robotium(这不适合我)。 我目前正在使用ActivityUnitTestCase进行测试。 如果需要更多信息,请不要犹豫。 编辑 我试图通过公开Dialog来使用下面的答案 public Dialog getDiag(){ return dialog; } 使用这个答案:当我在测试中运行showDialog()时遇到一个新问题,它在命中时会中断:dialog.show(); android.view.WindowManager $ BadTokenException:*无法添加窗口 – 令牌null

Android Java objModelClass.getClass()。getDeclaredFields()返回“$ change”作为一个字段

在我们的项目中,我们使用数据模型来存储从服务接收的数据。 因此,在我们将数据插入数据库的特定情况下,我们使用objModelClass.getClass()。getDeclaredFields()方法来获取所有字段名称,并且它正确地返回该类的所有字段名称,但也返回一个带有名称的额外字段“$ change”,在课堂上不存在。 奇怪的是,在Android工作室中没有这样的问题但是当我们升级到android studio 2.0时就发生了这种情况。 虽然我已经应用了快速修复,但我需要正确解决这个问题。 我想知道它为什么会发生? 这个函数使用这个方法 public void insertValuesIntoTable(final String strTableName, ArrayList alObjClasses, String strPrimaryKey, String strCompositeKey) { try { SQLiteDatabase db_w = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); //Iterate through every model class Object in the ArrayList and transfer the contents to the DB if (alObjClasses != null) for (Object objModelClass […]

自定义类加载/覆盖Android本机类

主要目标是使用我自己的实现覆盖Android系统类(Activity,View等)。 http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html 实现了自定义类加载的ClassLoader,加载非系统类(自定义类)工作。 但是当我尝试使用我的实现加载Activity时 – 它没有加载,因为ClassLoader已经在其缓存中有这个类: /** * Returns the class with the specified name if it has already been loaded * by the virtual machine or {@code null} if it has not yet been loaded. * * @param className * the name of the class to look for. * @return the {@code Class} object […]