服务器之家

服务器之家 > 正文

Java动态代理实现方法小结

时间:2021-07-16 16:24     来源/作者:changuncle

本文实例讲述了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

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部