来谈谈 Java 反射机制,动态代理是基于什么原理?

佐手、 提交于 2019-11-28 08:38:54

 

1 一些概念

首先我们来看一些概念性的描述:

注解(Annotation):也叫元数据。一种代码级别的说明。它是JDK 1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

反射:赋予程序在运行时自省(introspect)的能力。指的是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。

动态代理:是一种方便运行时动态处理代理方法调用的机制。很多场景都是利用类似机制,比如:用来包装RPC调用、面向切面编程(AOP)

AOP:面向切面编程。在不影响原有功能的情况下,对程序进行横向扩展。说说我自己的理解吧。某个类的方法已经封装好了,现在我们要对原有的方法进行干预,但是又不能破坏原来的类,这时候就需要aop的思想,把这个切点扩展成一个面来进行操作。(也就是生成该类的代理,对代理进行操作

依赖注入(控制反转):Spring是通过反射来实现依赖注入的。什么是依赖呢? 如果在A类里面调用B类,那么A类需要依赖于B类,通常的话,是A类来创建B类的示例。但是spring 里面,创建的动作由spring容器来完成,然在在运行的时候注入到A类中,所以叫做依赖注入。比如说注解@Resource和@Autowired等

  • 正常方式:通过完整的类名—>通过new实例化—>取得实例化对象
  • 反射方式:实例化对象—>getClass()方法—>通过完整的类名

总结: 反射和动态代理都是运行时的机制。通过反射,我们可以在运行时操作类或者对象。而动态代理,它是一个代理机制,代理可以看做是对调用目标的一个包装,代理除了可以调用目标,还可以做一些其他的操作。通过代理可以让调用者与实现者解耦。动态代理是运行的时候才自动生成代理对象,如果是编码阶段显式的指定代理类,就是静态代理了。

 

 

 

 

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!