反射 动态代理与AOP

待我称王封你为后i 2022-08-23 03:52 279阅读 0赞

本文用到的知识点是动态代理和反射的知识,本文属于简单的应用demo,如果不熟悉知识点的盆友可以点击我以前的文章,对于反射的底层实现有想了解的盆友可以点击反射机制以及应用的文章。

本文主要就是用简单的实例讲解动态代理和反射的常用的应用AOP。

简而言之,AOP就是利用动态代理机制在一业务前面切向的加入特定的方法,本demo中

  1. HumanUtil 是要切向加入的。有什么需要探讨的欢迎点击Q我吧相互交流O(∩_∩)O

AOP:Aspect Orient Programming

  1. package myNetDemo;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import javax.xml.ws.spi.Invoker;
  6. interface Human {
  7. void info();
  8. void fly();
  9. }
  10. // 被代理类
  11. class SuperMan implements Human {
  12. @Override
  13. public void info() {
  14. System.out.println("我是超人");
  15. }
  16. @Override
  17. public void fly() {
  18. // TODO Auto-generated method stub
  19. System.out.println("我可以飞");
  20. }
  21. }
  22. class HumanUtil {
  23. public void method1() {
  24. System.out.println("===方法一===");
  25. }
  26. public void method2() {
  27. System.out.println("===方法二===");
  28. }
  29. }
  30. class MyInvocationHandler1 implements InvocationHandler {
  31. Object obj;// 被代理类对象的声明
  32. public void setObject(Object obj) {
  33. this.obj = obj;
  34. }
  35. @Override
  36. public Object invoke(Object proxy, Method method, Object[] args)
  37. throws Throwable {
  38. HumanUtil hUtil = new HumanUtil();
  39. hUtil.method1();
  40. Object returnVal = method.invoke(obj, args);
  41. hUtil.method2();
  42. return returnVal;
  43. }
  44. }
  45. // 动态的创建一个代理类的对象
  46. class myProxy {
  47. public static Object getProxyInstance(Object obj) {
  48. MyInvocationHandler1 handler1 = new MyInvocationHandler1();
  49. handler1.setObject(obj);
  50. return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
  51. .getClass().getInterfaces(), handler1);
  52. }
  53. }
  54. public class TestAOP {
  55. public static void main(String[] args) {
  56. SuperMan man = new SuperMan();// 创建被代理类的对象
  57. Object obj = myProxy.getProxyInstance(man);// 返回代理类的对象
  58. Human h = (Human) obj;
  59. // 通过代理类的对象调用重写的抽象方法
  60. h.info();
  61. System.out.println();
  62. h.fly();
  63. System.out.println("***************");
  64. NikeClothFactory nike=new NikeClothFactory();
  65. Object objj=myProxy.getProxyInstance(nike);
  66. ClothesFactory clothesFactory=(ClothesFactory)objj;
  67. clothesFactory.productCloth();
  68. }
  69. }
  70. package myNetDemo;
  71. //静态代理模式
  72. //接口
  73. interface ClothesFactory {
  74. void productCloth();
  75. }
  76. // 被代理类
  77. class NikeClothFactory implements ClothesFactory {
  78. @Override
  79. public void productCloth() {
  80. System.out.println("Nike工厂生产衣服");
  81. }
  82. }
  83. // 代理类
  84. class ProxyFactory implements ClothesFactory {
  85. ClothesFactory cf;// 虽然声明的是总接口,但实例化时实际传进去的是具体被代理实现类
  86. // 在构造器内完成初始化
  87. public ProxyFactory(ClothesFactory cf) {
  88. this.cf = cf;
  89. }
  90. @Override
  91. public void productCloth() {
  92. System.out.println("代理类开始执行,收代理费");
  93. cf.productCloth();// 实际调用的是实际被代理类的实现方法
  94. }
  95. }
  96. public class TestProductClothes {
  97. public static void main(String[] args) {
  98. NikeClothFactory nikeClothFactory = new NikeClothFactory();// 创建被代理类的对象
  99. ProxyFactory pFactory = new ProxyFactory(nikeClothFactory);// 创建爱你代理类的对象
  100. pFactory.productCloth();// 实际调用的是被代理类方法
  101. // 若再有一个接口,还要在于一个接口的实现类(被代理类,目标类),在造一个代理类实现接口
  102. // 于是想要动态代理
  103. }
  104. }

发表评论

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

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

相关阅读

    相关 反射动态代理

    实例说明   代理是Java SE 1.3版新增的特性。使用代理可以在程序运行时创建一个实现指定接口的新类。通常只有在编译时无法确定需要使用哪个接口时才需要使用代理,这

    相关 反射机制动态代理

    以前学习基础的时候不知道哪些是重点,也不会注意,自己动手少,用的少,自然也不会知道,就落下了知识点,当被问反射机制起来时,听过,但怎么说,到底是怎么一回事,脑子一片空白,答不上