转载本文请联系小明菜市场公众号。什么是反射一般来说,需要一个功能的前提是遇到什么问题,先列出一些问题,然后通过反射如何解决这些问题。普通开发者在工作中最常遇到的问题就是需要生成代理对象。解决方法是:加载需要通过反射加强的类,与补充逻辑结合生成新的对象。该对象为代理对象,即原有类和新逻辑的增强类。比如Man类中有一个eat方法。我们想在执行eat方法前后洗手洗碗,但是不能修改eat方法。这时候我们就需要使用一个代理对象来执行eat方法前后的这些操作。应用场景制定通用框架。反射最重要的用途是开发各种通用框架。许多框架,例如Spring,都是可配置的。为了保证框架的通用性,他们可能需要根据配置文件加载不同的对象和类。调用不同的方法,这个时候就需要使用反射在运行时动态加载需要的对象。动态代理,在切面编程中,需要拦截特定的方法,通常使用动态代理,动态代理需要使用反射技术来实现。注:Notes也使用反射机制调用注解解释器,根据note的标记执行行为。如果没有反射机制,该note将无效。可扩展性功能允许应用程序使用完全限定名称创建可扩展对象实例。反射和代理涉及的术语真实对象:是原始类实例化后生成的对象,是没有经过代理方式增强的对象。代理对象:使用代理模式增强的对象。动态代理类:代理对象逻辑处理器,也就是增强逻辑所在的地方,需要传入真实的对象,生成关联的动态代理对象。invocationHandler接口:动态代理类需要实现该接口,重写invoke方法。增强的逻辑在invoke方法中。代理类的每个实例都与一个处理程序相关联。当我们调用代理对象时,它会转发给invocationHandler接口的invoke方法来调用。Proxy:代理类,用于传入动态代理对象后生成代理对象。代理模式的主要作用是生成代理对象,实现增强方法。反射,作为Java提供的一个特性,是实现代理模式的基础,即利用反射技术获取和操作Java程序中的类,从而控制这些类被打包处理,生成代理对象.获取代理对象:第一步:调用Proxy.newProxyInstance获取动态代理对象,接收三个参数。最后一个参数是一个ClassLoader对象,定义了由哪个ClassLoader对象生成一个代理对象来加载一个Interface对象数组,说明我们需要给代理对象提供什么接口?如果为其提供了一组接口,则代理对象通过使用多态性来实现该接口。这组接口中的方法是通过多态来调用的。3.一个InvocationHandler实现类对象,表示当我的动态代理对象调用方法时,会关联到哪个invocationHandler实现类对象。第二步:获取代理对象的类对象第三步:获取代理类的所有方法第四步:通过代理对象调用实现类的方法触发我们的关键步骤,调用的实现类的方法invocationHandler接口,从而执行实现类的方法。第五步:调用invocationHandler接口。传入三个参数,这三个参数是:proxy指的是我们代理的真实对象。method我们需要调用的方法args需要传入的参数。jdk动态代理和CGLIB动态代理的区别Proxy方法:通过继承真实对象的类或者实现它需要实现的接口,添加增强逻辑来完成。jdk动态代理是通过实现接口来完成的。当通过实现接口生成类时,就是jdk动态代理。CGLIB动态代理是通过继承类来完成的。当一个类没有实现接口时,只能使用jdk动态代理。反射框架Java提供了反射来获取类的各种属性和方法。需要获取类才能进行相应的操作。但是反射框架Reflections不仅可以获取classpath下的类,还可以根据具体的注解获取。反射扫描类路径,索引元数据,并允许在允许时查询元数据。使用Reflections,你可以很方便的获取到如下元数据某个类型的所有子类只要类型、构造函数、方法、字段有特定的注解,你就可以通过这个注解获取所有的信息。获取与正则表达式匹配的所有资源获取具有特定签名的方法,包括参数、参数注释和返回类型。获取方法名,获取代理中的所有字段,方法名,构造函数的使用。作者简介我是晓晓,一名出生在二线城市,生活在一线城市的程序员。我是晓晓。下次见。
