反射,获取View的在res/Layout布局中声明的onClick属性名称

 通过反射,获取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;
	}
	
}

猜你喜欢

转载自blog.csdn.net/scimence/article/details/88575177