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

爱被打了一巴掌 2022-04-06 04:40 371阅读 0赞

首先说下作用,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(对象,实际参数)

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

发表评论

表情:
评论列表 (有 0 条评论,371人围观)

还没有评论,来说两句吧...

相关阅读

    相关 InvokeBeginInvoke

    [点击打开链接][Link 1] 近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解[

    相关 简单理解==equals

    我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较        1. == 是一个运算符。   2.Equals则是string对象的方法,可

    相关 InvokeBeginInvoke理解

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:[对.net事件的看法][.net]。 一、为什么C