java的invoke与getMethod方法用法

和listener一起使用举例:
需要在控件中监听某个动作:比如button点击,画面滚动等

1.为控件定义一个属性:属性绑定一个方法

xxxProperty ="onPropertyXxxxFunc”

2.首先自定义一个Listener

// 在控件构造函数中获得控件属性的值xxxPropertyValue
// 将该属性作为参数传递给自定义的Listener
new xxxListener(this, xxxPropertyValue)

3.类似与Android原生的Listener,设计一个interface

public interface OnXxxxListener {
        void onXXXSignalFunc(需要用的参数列表);
}

4.该xxxListener实现OnXxxxListener的接口

// 在构造中拿到属性中绑定的方法"onPropertyXxxxFunc"
context.getClass().getMethod(xxxPropertyValue,参数类型……)
//重写OnXxxxListener中onXXXSignalFunc方法
上面拿到的方法调用invoke,触发该方法onPropertyXxxxFunc

5.在画面中实装onPropertyXxxxFunc

6.调用onXXXSignalFunc方法:在接收画面滚动信号,down,等信号时调用。调用onXXXSignalFunc方法,会调用invoke,触发onPropertyXxxxFunc,画面处理某些逻辑

Method getMethod(String name,Class...parameterTypes)

name: method的名称
parameterTypes:method的参数类型的列表(参数顺序需按声明method时的参数列表排列)
返回:符合method名称和参数的method对象
抛出错误:NoSuchMethodException (没有找到所要查询的Method对象或Method名称为“<init>”或“<clinit>”)
		  NullPointerException (所要查询的Method对象的名称为null)
		  SecurityException(调用的类或其父类没有调用权限)

invoke方法

作用:调用包装在当前Method对象中的方法。
原型:Object invoke(Object obj,Object...args)
参数解释:obj:实例化后的对象
                  args:用于方法调用的参数
返回:根据obj和args调用的方法的返回值
抛出错误:IllegalAccessException(Method对象强制Java语言执行控制或无权访问obj对象)
		  IllegalArgumentException(方法是实例化方法,而指定需要调用的对象并不是实例化后的类或接口)

一个完整的例子:

https://www.sczyh30.com/posts/Java/java-reflection-1/
https://www.sczyh30.com/posts/Java/java-reflection-2/

posted on 2020-05-18 10:02  JJ_S  阅读(2114)  评论(0编辑  收藏  举报