Articles of reflection

如何实例化Android活动(使用reflection)?

今天在Android采访中被问到这个问题。 我回答了平时,你知道,意图+ startActivity等等。然后采访者更有针对性地问道, “是的,但它实际上在哪里被实例化 ?你不会在任何地方调用新的Activity”。 现在我想到了,我真的不知道。 他暗示它使用了Javareflection,但我没有很多经验,而且我只用它来访问Android SDK中的一些variables。 有人可以解释如何使用reflection实例化Activity, 为什么 ? 奖励积分可以洞察采访者在了解这一点时所看到的价值。

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

在我们的项目中,我们使用数据模型来存储从服务接收的数据。 所以在我们向数据库插入数据的特定情况下,我们使用objModelClass.getClass()。getDeclaredFields()方法来获取所有字段名称,并且正确返回了该类的所有字段名称,但也返回了一个名称“$ change”,这在课堂上是不存在的。 奇怪的是,在android工作室没有这样的问题,但是当我们升级到android studio 2.0这发生。 虽然我已经应用了一个快速修复,但我需要妥善解决这个问题。 我想知道为什么发生? 这个函数使用这个方法 public void insertValuesIntoTable(final String strTableName, ArrayList<Object> 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 / Java:使用reflection调用方法?

我有一个名为chooseDialog(String s,int i)的静态方法,我想根据提供给chooseDialog的参数在同一个类(Dialogs.class)中调用另一个方法。 s是所需的方法的名称,我是它的单个参数。 我已经尝试了大量的教程,花了几个小时阅读这个主题,但我似乎无法确切地知道我需要做什么。 有任何想法吗? 谢谢!

自定义类加载/重写Android本机类

主要目标是用我自己的实现覆盖Android系统类(Activity,View等)。 http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html 用于自定义类加载的ClassLoader被实现,加载非系统类(自定义类)的作品。 但是,当我尝试加载与我的实现活动 – 它不加载,因为ClassLoader已经在它的caching中有这个类: /** * 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 […]

Jelly Bean中的飞行模式

我正在尝试使用Android 4.2.2在Nexus 4中设置飞行模式。 我知道这是不可能的,因为AIRPLANE_MODE_ON被移动到全局系统设置 ,它只是一个读取选项。 有没有其他的方式来做类似的事情,我的意思是禁用收音机? 我可以禁用蓝牙,WiFi和互联网连接,但电话networking仍然活跃。 可以用NDK创build一个库来完全禁用networking? 编辑 :我已经尝试使用java.lang.reflect使这个方法: @SuppressLint("NewApi") @SuppressWarnings("rawtypes") private boolean putStringAirplaneMode() throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { ContentResolver resolver = context.getContentResolver(); String name = Settings.Global.AIRPLANE_MODE_ON; String value = (isEnabled() ? "1" : "0"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Log.v("AirplaneBatterySaver", "Using reflection to change airplane mode"); // For JELLY_BEAN_MR1 use reflection. […]

从代理对象访问字段

在开发Android的ORM框架时,我遇到了一个有趣的问题。 我正在使用一个名为dexmaker的库来进行字节码操作,这使我可以为持久对象创build代理来实现延迟加载。 被代理的实例有一个关联的InvocationHandler ,当代理invoke方法时, InvocationHandler invoke方法,然后调用代理对象各自的方法,假设它被延迟加载。 没有什么太意外的 – 就像Java的Proxy类一样,但是允许我代替实际的类来代替接口(参见dexmaker的ProxyBuilder )。 成为问题的部分是我也使用reflection来检索来自持久对象的字段值,现在我已经引入了延迟加载代理。 这是我目前正在做的事情: for (Field f : getPersistentFields(model.getClass()) { … Object val = f.get(model); // model is either a persistent object or a proxy for one mapField(f, val, map); } 这当然适用于常规模型实例,但对于代理实例, f.get(model)不会检索代理对象的字段值。 相反,它会返回在类的构造函数中分配的默认值。 代理领域的访问没有被明显拦截。 我的问题是这样的:有什么办法可以拦截通过reflection的代理的成员variables访问? 如果不是,我怎样才能以类似“reflection”的方式检索代理字段的值? 我想到的一个可能的解决方法是检索,然后调用字段的getter方法使用reflection,但我想知道是否有一个更直接的解决scheme。 这个解决方法,如果它真的起作用 ,将需要对象为所有持久性字段设置一个getter方法 – 一个通常应该从OOdevise的angular度来遵循的要求,但是也会把更多的工作强加给框架的用户。 我愿意接受任何想法。

Android,如何清除最近的任务列表,可以从主页button在大多数手机? 反思是一种可能的方式?

我正在写一个启动器,它需要从系统清除最近的应用程序/任务列表,而不是“没有显示我的应用程序在最近的任务列表”,但我现在不知道。 我已经在stackoverflowsearch,只有这个问题是匹配的,但答案没有任何帮助。 其他一些人也提出了相同的问题,他提到了来自Android 4.0的RemoveTask。 是的,我已经检查了Android 2.3.7和Android 4.0的源代码,估计我估计可以达到终点,如果我可以删除ActivityMangerService.Java中定义的mRecentTasks列表: final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>(); 另一个可能的定义是: static ActivityManagerService mSelf; public static ActivityManagerService self() { return mSelf; } 因为我不熟悉Java和refelction,所以我需要关于清单的方法帮忙,下面是我的代码: public static <T> void clearRecentTaskList(Launcher launcher){ ActivityManager am = (ActivityManager) launcher.getSystemService(Context.ACTIVITY_SERVICE); Object systemRecentTask = new ArrayList<T>(); Object receiver = null; Field recentTaskList = null; Class<?> service = null; Field […]

Android:如何根据API的版本来编码?

在Android中,我很容易获得SDK的版本( Build.VERSION.SDK ),但是只有平台比1.6( >Build.VERSION_CODES.DONUT )更新时才需要使用LabeledIntent。 我认为反思是必要的(我已经阅读了这个链接,但是对于一个class级或者我不清楚)。 这是代码,但它给了我一个例外,因为在我的Android 1.6中,编译器validation包是否存在,即使条件不适用: Intent theIntent=….; if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT) { try{ Intent intentChooser = Intent.createChooser(intent,"Choose between these programs"); Parcelable[] parcelable = new Parcelable[1]; parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0); intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable); activity.startActivity(intentChooser); } catch(Exception e) { activity.startActivity(theIntent); } } else { activity.startActivity(intentMedicamento); } 我如何解决它,对正确的答案的一些注意事项 @Commonsware向我展示了如何做到这一点。 我们创build一个桥接类,以便根据API LEVEL,实例化一个使用API​​ LEVEL的类或另一个使用另一个API LEVEL的类。 […]

从Android项目的包中检索类的列表

我知道使用reflection来获取包中的所有类是不容易的,但是我想知道是否有人知道一个好的解决scheme/解决方法,特别是对于Android项目? 给定一个包,我需要能够从中检索所有的类,并使用reflection来处理它们的注释。 有谁知道一个办法做到这一点? 有没有可用的图书馆?

我可以重写一个隐藏(但公开)的方法,并调用其超级方法?

有一个非公开API,我需要重写,以解决与Android的WebView怪癖。 API是隐藏的,但它是公开的: /** * … * * @hide pending API council approval */ public boolean selectText() { … } 所以我可以重写它,只需在我自己的WebView类中声明它,减去@Override: public boolean selectText() { … } 是否有可能从我的重写调用超级方法? 通常我可以写: public boolean selectText() { return super.selectText(); } 但该方法是隐藏的,所以super.selectText()不可用。 如果我使用reflection: public boolean selectText() { return (Boolean) WebView.class.getMethod("selectText").invoke(this, (Object[]) null); } 我得到一个无限循环,因为它调用我重写的方法。 有无论如何覆盖这种方法,并能够调用超级方法? 谢谢!