反射_动态代理和AOP

淡淡的烟草味﹌ 2022-05-20 01:04 305阅读 0赞

70

最理想的效果是:代码块1、2、3既可以执行方法A,又无须在程序中以硬编码的方式直接调用深色代码的方法

70 1

  1. interface Human {
  2. void info();
  3. void fly();
  4. }
  5. //被代理类
  6. class Superman implements Human {
  7. @Override
  8. public void info() {
  9. System.out.println("我是超人");
  10. }
  11. @Override
  12. public void fly() {
  13. System.out.println("I can fly");
  14. }
  15. }
  16. class HumanUtil {
  17. public void method1() {
  18. System.out.println("法一");
  19. }
  20. public void method2() {
  21. System.out.println("法二");
  22. }
  23. }
  24. //代理类
  25. class MyInvocationHandlers implements InvocationHandler {
  26. Object obj;//被代理类对象的声明
  27. public void setObj(Object obj) {
  28. this.obj = obj;
  29. }
  30. @Override
  31. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  32. HumanUtil humanUtil = new HumanUtil();
  33. humanUtil.method1();
  34. Object returnVal = method.invoke(obj, args);
  35. humanUtil.method2();
  36. return returnVal;
  37. }
  38. }
  39. class Myproxy {
  40. //动态的创建一个代理类的对象
  41. public static Object getProxyInstance(Object obj) {
  42. MyInvocationHandlers handler = new MyInvocationHandlers();
  43. handler.setObj(obj);
  44. return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
  45. }
  46. }
  47. public class TestAOP {
  48. public static void main(String[] args) {
  49. Superman superman = new Superman();//创建了一个被代理类的对象
  50. Object object = Myproxy.getProxyInstance(superman);//返回一个代理类的对象
  51. Human human = (Human) object;
  52. //通过代理类的对象调用重写的抽象方法
  53. human.info();
  54. human.fly();
  55. }
  56. }

发表评论

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

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

相关阅读

    相关 动态代理AOP实战

    一 点睛 动态代理在AOP(Aspect Orient Program,即面向切面编程)里被称为AOP代理,AOP代理可代替目标对象,AOP代理包含了目标对象的全部方法。但A