好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java动态代理实现方法小结

本文实例讲述了java 动态代理 实现方法。分享给大家供大家参考,具体如下:

静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记录下来,日后时常看看争取早日融会贯通。

1、jdk实现动态代理

主要使用了proxy.newproxyinstance()方法,该方法的官方解释为:返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

public interface isomeservice {

   string dofirst();

   void dosecond();

   string dothird();

}

//目标类:代理类要增强的类

public class someserviceimpl implements isomeservice {

   @override

   public string dofirst() {

     return "aaabbb" ;

   }

   @override

   public void dosecond() {

     system.out.println( "someserviceimpl:执行dosecond()" );

   }

   @override

   public string dothird() {

     return "aaa" ;

   }

}

public class mytest {

   public static void main(string[] args) {

     isomeservice target = new someserviceimpl();

     isomeservice someservice = (isomeservice) proxy.newproxyinstance(

         target.getclass().getclassloader(),

         target.getclass().getinterfaces(),

         new invocationhandler() {

           // proxy:代理对象

           // method:目标方法

           // args:目标方法的参数列表

           @override

           public object invoke(object proxy, method method, object[] args) throws throwable {

             object result = method.invoke(target, args);

             if (result!= null ) {

               result=((string)result).touppercase();

             }

             return result;

           }

         });

     system.out.println(someservice.dofirst());

     someservice.dosecond();

     system.out.println(someservice.dothird());

   }

}

2、cglib实现动态代理(没接口)

使用jdk的proxy实现动态代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现。

对于没有接口的类,要为其创建动态代理,就要使用cglib来实现。cglib动态代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。使用cglib生成代理类,要求目标类必须能被继承,因此不能是final类。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

//目标类:代理类要增强的类

public class someservice {

   public string dofirst() {

     system.out.println( "someserviceimpl:执行dofirst()" );

     return "aaabbb" ;

   }

   public void dosecond() {

     system.out.println( "someserviceimpl:执行dosecond()" );

   }

}

//注意:使用cglib动态代理,要求目标类不能是final的

//cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承

public class cglibfactory implements methodinterceptor {

   private someservice target;

   public cglibfactory() { }

   public cglibfactory(someservice target) {

     this .target = target;

   }

   public someservice mycglibcreator() {

     enhancer enhancer = new enhancer();

     //指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类

     enhancer.setsuperclass(someservice. class );

     //设置回调接口对象

     enhancer.setcallback( this );

     //create()方法用于创建cglib动态代理对象

     return (someservice)enhancer.create();

   }

   //回调函数的执行条件:代理对象执行目标方法时会触发该方法

   @override

   public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable {

     object invoke = method.invoke(target, args);

     if (invoke!= null ) {

       invoke=((string)invoke).touppercase();

     }

     return invoke;

   }

}

public class mytest {

   public static void main(string[] args) {

     someservice target = new someservice();

     someservice proxy = new cglibfactory(target).mycglibcreator();

     proxy.dofirst();

   }

}

3、cglib实现动态代理(有接口)

在有接口的情况下利用cglib实现动态代理跟没有接口的情况下利用cglib实现动态代理,其实差不多。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

public interface isomeservice {

   string dofirst();

   void dosecond();

   string dothird();

}

//目标类:代理类要增强的类

public class someservice implements isomeservice {

   public string dofirst() {

     return "aaabbb" ;

   }

   public void dosecond() {

     system.out.println( "someserviceimpl:执行dosecond()" );

   }

   @override

   public string dothird() {

     return "third" ;

   }

}

//注意:使用cglib动态代理,要求目标类不能是final的

//cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承

public class cglibfactory implements methodinterceptor {

   private isomeservice target;

   public cglibfactory() { }

   public cglibfactory(isomeservice target) {

     this .target = target;

   }

   public isomeservice mycglibcreator() {

     enhancer enhancer = new enhancer();

     //指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类

     enhancer.setsuperclass(isomeservice. class );

     //设置回调接口对象

     enhancer.setcallback( this );

     //create()方法用于创建cglib动态代理对象

     return (isomeservice)enhancer.create();

   }

   //回调函数的执行条件:代理对象执行目标方法时会触发该方法

   @override

   public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable {

     object invoke = method.invoke(target, args);

     if (invoke!= null ) {

       invoke=((string)invoke).touppercase();

     }

     return invoke;

   }

}

public class mytest {

   public static void main(string[] args) {

     isomeservice target = new someservice();

     isomeservice proxy = new cglibfactory(target).mycglibcreator();

     system.out.println(proxy.dofirst());

     proxy.dosecond();

     system.out.println(proxy.dothird());

   }

}

希望本文所述对大家java程序设计有所帮助。

原文链接:https://blog.csdn.net/xiaouncle/article/details/80413350

查看更多关于Java动态代理实现方法小结的详细内容...

  阅读:18次