必威体育Betway必威体育官网
当前位置:首页 > IT技术

method.invoke()和invoke()简单理解

时间:2019-08-12 08:14:29来源:IT技术作者:seo实验室小编阅读:83次「手机版」
 

method.invoke

首先说下作用,method.invoke(Object obj,Object args[])的作用就是调用method类代表的方法,其中obj是对象名,args是传入method方法的参数

举个例子:如果接口中没有close方法,但是实现类中提供了close,那么就可以用反射来处理,调用实现类的close方法

invoke()方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。

invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回.

有四种获得method对象的方法,返回结果是method对象,或者说是 方法的全限定名

一共有4种方法,全部都在Class类中:

  - getMethods(): 获得类的public类型的方法

  - getMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

  - getDeclaredMethods(): 获取类中所有的方法(public、protected、default、private)

  - getDeclaredMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

另外关于代理类,以下Proxy.newProxyinstance的相关内容 是整理自B站的一个视频

链接如下:https://www.bilibili.com/video/av15369076?p=19

Proxy.newProxyInstance

*         参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存

*                一般情况:方式1:当前类.class.getClassLoader();

*                                方式2:目标类实例.getClass().get...

*         参数2:Class[] interfaces 代理类需要实现的所有接口

*                方式1:目标类实例.getClass().getInterfaces()  ;但是需要注意:这种方法只能获得自己接口,不能获得父元素接口

*                方式2:new Class[]{UserService.class}  

*                例如:jdbc 驱动  --> DriverManager  不能获得接口 Connection

*         参数3:Invocationhandler  处理类,接口,必须进行实现类,一般采用匿名内部

*         提供invoke 方法,代理类的每一个方法执行时,都将调用一次invoke

*         参数31:Object proxy :代理对象

*         参数32:Method method : 代理对象当前执行的方法的描述对象(反射)

*                  执行方法名:method.getName()

*           参数33:Object[] args :方法实际参数

Invoke方法内部:

*                  执行方法:method.invoke(对象,实际参数)

public class MyBeanFactory {
	
	public static UserService createService(){
		//1 目标类
		final UserService userService = new UserServiceImpl();
		//2切面类
		final MyAspect myAspect = new MyAspect();
		/* 3 代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面
		 * 	Proxy.newProxyInstance
		 * 		参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。
		 * 			一般情况:当前类.class.getClassLoader();
		 * 					目标类实例.getClass().get...
		 * 		参数2:Class[] interfaces 代理类需要实现的所有接口
		 * 			方式1:目标类实例.getClass().getInterfaces()  ;注意:只能获得自己接口,不能获得父元素接口
		 * 			方式2:new Class[]{UserService.class}   
		 * 			例如:jdbc 驱动  --> DriverManager  获得接口 Connection
		 * 		参数3:InvocationHandler  处理类,接口,必须进行实现类,一般采用匿名内部
		 * 			提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke
		 * 				参数31:Object proxy :代理对象
		 * 				参数32:Method method : 代理对象当前执行的方法的描述对象(反射)
		 * 					执行方法名:method.getName()
		 * 					执行方法:method.invoke(对象,实际参数)
		 * 				参数33:Object[] args :方法实际参数
		 * 
		 */
		UserService proxService = (UserService)Proxy.newProxyInstance(
								MyBeanFactory.class.getClassLoader(), 
								userService.getClass().getInterfaces(), 
								new InvocationHandler() {	
									@Override
									public Object invoke(Object proxy, Method method, Object[] args) throws throwable {
										//前执行
										myAspect.before();	
										//执行目标类的方法
										Object obj = method.invoke(userService, args);				
										//后执行
										myAspect.after();
										
										return obj;
									}
								});
		return proxService;
	}

}

相关阅读

C# begininvoke (control)

namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() {

Method之invoke()方法的使用

一、为什么要用invoke方法 主要是为了类反射,这样你可以在不知道具体的类的情况下,根据配置的字符串去调用一个类的方法。在灵活编

JAVA深入研究——Method的Invoke方法。

JAVA深入研究——Method的Invoke方法。 在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而

java反射及Method的Invoke()方法

用传统的OOP思想来说,任何一个你写好的且编译过的生成的Class文件,在被类加载器加载后,都会对应有一个java.lang.Class这个类的实例

c# Invoke 与BeginInvoke 的用法

 最近在学习线程时,发现当我创建的线程需要访问UI界面的时,会发生异常,原因是我在跨线程调用主线程的控件,因此windows GUI编程有一

分享到:

栏目导航

推荐阅读

热门阅读