通过反射,获取View的在res/Layout布局中声明的onClick属性名称
Button view = (Button)this.findViewById(R.id.button1);
String methodName = get_onClickName(view); // 获取button1设置的onClick属性名称
import java.lang.reflect.Field;
import android.view.View;
/** 反射,调用Object中的函数、获取Object中的指定变量 */
public class ReflectTool
{
/** 通过反射,获取View的在res/Layout布局中声明的onClick属性名称 */
public static String get_onClickName(View view)
{
if(view==null) throw new NullPointerException("view == null");
String Name = "";
// 反射 View.mListenerInfo.mOnClickListener.val$handlerName
try
{
Object mListenerInfo = getSubField(view, View.class, "mListenerInfo");
Object mOnClickListener = getSubField(mListenerInfo, "mOnClickListener");
Object handlerName = getSubField(mOnClickListener, "val$handlerName");
Name = handlerName.toString();
}
catch (Exception e)
{
// e.printStackTrace();
}
return Name;
}
/** 反射获取obj的成员变量fieldName(成员变量名获取,可在调试时动态查看) */
public static Object getSubField(Object obj, String fieldName)
{
if(obj==null) throw new NullPointerException("obj == null");
Object subObj = null;
try
{
if (obj != null)
{
Field field = obj.getClass().getDeclaredField(fieldName); // 获取成员变量对应的Field方法
field.setAccessible(true); // 设置为可访问
subObj = field.get(obj); // 通过Field方法从Object中提取子变量
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return subObj;
}
/** 反射获取obj的成员变量fieldName(成员变量名获取,可在调试时动态查看) */
public static Object getSubField(Object obj, Class<?> cls, String fieldName)
{
if(obj==null) throw new NullPointerException("obj == null");
Object subObj = null;
try
{
if (obj != null)
{
Field field = cls.getDeclaredField(fieldName); // 获取成员变量对应的Field方法
field.setAccessible(true); // 设置为可访问
subObj = field.get(obj); // 通过Field方法从Object中提取子变量
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return subObj;
}
}