gpt4 book ai didi

实例讲解Java中动态代理和反射机制

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 31 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章实例讲解Java中动态代理和反射机制由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

反射机制 。

java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法、属性和构造方法等.

动态代理:分为jdk动态代理、cglib动态代理(spring中的动态代理).

静态代理 。

预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 。

动态代理 。

代理类在程序运行时创建的代理方式。也就是说,代理类并不是在java代码中定义的,而是在运行期间根据我们在java代码中的“指示”动态生成的.

动态代理比静态代理的优势在于:

动态代理可以很方便的对代理类的函数进行统一的处理(invoke),而不是修改每个代理类的函数,更灵活和扩展.

jdk的动态代理(依赖于接口) 。

在java的动态代理机制中,有两个重要的类或接口,一个是invocationhandler接口,另一个是proxy类.

invocationhandler接口是给动态代理类实现的,负责处理被代理对象的操作 。

proxy类是用来创建动态代理类实例对象的,只有得到这个对象,才能调用需要代理的方法.

动态代理的代理类是在静态代理类上进行修改,将动态代理类实现invocationhandler接口,java电子书重写invoke方法,invoke方法通过传入的被代理类方法和参数来执行.

如下实例:

?
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
public interface appservice {
  void createapp(string name);
  void deleteapp(string name);
}
//代理类(比如微商代理)
public class appserviceimpl implements appservice{
 
  @override
  public void createapp(string name) {
   system.out.print( "app[" +name+ "] has been created." );
  }
 
  @override
  public void deleteapp(string name) {
   system.out.print( "app[" +name+ "] has been delete." );
  }
}
 
import java.lang.reflect.invocationhandler;
import java.lang.reflect.method;
 
public class loggerinterceptor implements invocationhandler {
  private object target; //委托类(被代理类)的实例,比如厂家
  public loggerinterceptor(object target){
   this .target = target;
  }
  @override
  public object invoke(object proxy, method method, object[] args) throws throwable {
   system.out.println( "entered " +target.getclass().getname()+ "-" +method.getname()+ ",with arguments{" +args[ 0 ]+ "}" );
   object result = method.invoke(target, args);
   //调用目标对象的方法 (调用厂家的方法(createapp)及参数(kevin test))
   system.out.println( "before return:" +result);
   return result;
  }
 
}
?
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
import java.lang.reflect.proxy;
 
public class test {
 
public static void main(string[] args) {
    appservice target = new appserviceimpl(); //生成目标对象 (代理类的对象)
     //接下来创建代理对象
    appservice proxy = (appservice) proxy.newproxyinstance(
    target.getclass().getclassloader(),
    target.getclass().getinterfaces(), new loggerinterceptor(target));
    proxy.createapp( "kevin test1" );
    proxy.deleteapp( "kevin test2" );
  }
 
} /**
* 1、jdk的动态代理实现方式是依赖于接口的,首先使用接口来定义好操作规范。
* 2、通过proxy类产生的代理对象调用被代理对象的操作。
* 3、而这个操作又被分发给invocationhandler接口的invoke方法具体执行
*
* 在java的动态代理机制中,有两个重要的类或接口,一个是invocationhandler接口、另一个则是 proxy类,这个类和接口是实现我们动态代理所必须用到的。
invocationhandler接口是给动态代理类实现的,负责处理被代理对象的操作的,而proxy是用来创建动态代理类实例对象的,因为只有得到了这个对象我们才能调用那些需要代理的方法。
*
* 此方法的参数含义如下
proxy:代表动态代理对象
method:代表正在执行的方法
args:代表当前执行方法传入的实参
返回值:表示当前执行方法的返回值
*
* 如上:
* 使用了proxy类的newproxyinstance方法生成代理对象,然后用这个对象去调用createapp()和deleteapp()方法,
* 其实系统会将这2个方法分发给invoke()方法区执行。其中proxy对象的类是系统帮我们动态创建了,其实实现了我们的业务接口appservice
*
*/

cglib动态代理(继承方式) 。

cglib动态代理中使用methodinterceptor来实现动态代理类.

拦截器methodinterceptor中就是由methodproxy的invoksuper方法调用代理方法的.

methodproxy类生成代理方法和代理方法的签名.

jdk动态代理和cglib动态代理的区别:

1、jdk动态代理是实现了被代理对象的接口,cglib是继承了被代理对象.

2、cglib因为是继承机制,所以无法代理被final修饰的方法.

3、jdk和cglib都是在运行期间生产字节码,jdk是直接写class字节码,cglib使用asm框架写class字节码;cglib代理实现更复杂,生成代理类比jdk效率低.

4、jdk调用代理方法,是通过反射实现机制调用,cglib是通过fashclass机制直接调用方法,效率更高.

fastcalss机制:

为代理类和被代理类个生成一个class,这个class会为代理类或被代理类的方法分配一个index.

这个index当做一个入参,fashclass就可以直接定位要调用的方法,并直接进行调用。这样省去了反射调用,所以效率高.

最后此篇关于实例讲解Java中动态代理和反射机制的文章就讲到这里了,如果你想了解更多关于实例讲解Java中动态代理和反射机制的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com