简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

反射机制

Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。可以在运行时通过提供完整的“包名+类名.class”得到某个对象的类型。

功能

在运行时能判断任意一个对象所属的类。

在运行时能构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法。

利用Java反射机制我们可以加载一个运行时才得知名称的 class,获悉其构造方法,并生成其对象实体,能对其 fields 设值并唤起其methods。

应用场景

通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。

反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。

特点:

由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

动态代理

一种方便运行时动态构建代理、动态处理代理方法调用的机制。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在两者之间起到中介的作用(可类比房屋中介,房东委托中介销售房屋、签订合同等)。

所谓动态代理,就是实现阶段不用关心代理谁,而是在运行阶段才指定代理哪一个对象(不确定性)。如果是自己写代理类的方式就是静态代理(确定性)。

组成要素:

1、抽象类接口

2、被代理类(具体实现抽象接口的类)

3、动态代理类:实际调用被代理类的方法和属性的类

应用场景

很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。其是反射延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决

实现方式

1、JDK 自身提供的动态代理,主要利用了反射机制。

2、利用传更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。

举例,常可采用的 JDK 提供的动态代理接口InvocationHandler 来实现动态代理类。其中 invoke 方法是该接口定义必须实现的,它完成对真实方法的调用。通过 InvocationHandler 接口,所有方法都由该 Handler 来进行处理,即所有被代理的方法都 InvocationHandler 接管实际的处理任务。此外,我们常可以在 invoke 方法实现中增加自定义的逻辑实现,实现对被代理类的业务逻辑无侵入。

知识扩展:

代理模式(通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭……让应用开发者可以只关心他的业务)

静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。

动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间。

JDK 动态代理:基于 Java 反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。新版本也开始结合 ASM 机制。

cglib 动态代理:基于 ASM 机制实现,通过生成业务类的子类作为代理类。

Java 反射机制的常见应用:动态代理(AOP、RPC)、提供第三方开发者扩展能力(Servlet 容器,JDBC 连接)、第三方组件创建对象(DI)等等

反射机制:

反射提供了 AccessibleObject.setAccessible?(boolean flag)。它的大多数子类重写了这个方法,这里的所谓 accessible 可以理解成修饰成员的 public、protected、private,这意味着我们可以在运行时修改成员访问限制!

setAccessible 的应用场景:

1、我们为一个 Java 实体对象,运行时自动生成 setter、getter 的逻辑,这是加载或者持久化数据非常必要的,框架通常可以利用反射做这个事情,而不需要开发者手动写类似的重复代码。

2、绕过 API 访问控制。我们日常开发时可能被迫要调用内部 API 去做些事情,比如,自定义的高性能 NIO 框架需要显式地释放 DirectBuffer,使用反射绕开限制是一种常见办法。

动态代理:

动态代理解决了什么问题?

1、它是一个代理机制(代理可以看作是对调用目标的一个包装)。通过代理,我们对目标代码的调用不是直接发生的,而是通过代理完成。

2、通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,框架内部的寻址、序列化、反序列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友善的界面。

原文地址:http://blog.51cto.com/14180251/2344597

时间: 2024-10-11 03:30:53

简谈Java 反射机制,动态代理的相关文章

Java反射机制动态代理

package com.kaige123;/** * 程序员 * @author 凯哥 */public interface Chengxuyuan {    /**     * 写代码方法     */    public void xiedaima(); } package com.kaige123;/** * 程序员接口实现类 * @author 凯哥 */public class ChengxuyuanImpl implements Chengxuyuan {    public voi

java反射与动态代理

Java反射与动态代理 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性.这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握! Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为

浅谈-Java设计模式之动态代理

动态代理模式(Dynamic Proxy Pattern): 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler该接口唯一方法 invoke(Object proxy, Method method, Object[] args) Object

java反射实现动态代理

参考:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://my.oschina.net/lyp3314/blog/136589 反射可以通过class来创建对象或者修改对象.这样就提供了一个操作对象的方法. 下面拷贝前辈的总结: <反射机制> 为了更好的理解java的反射机制,最好先对java的泛型有所了解.java泛型就是参数化类型,即为所操作的数据类型指定一个参数.如果只指定了<?>,

java反射与动态代理的理解

一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制. 讲的通俗一点的话就是,对于jvm来说,.java文件必须要先编译为.class文件才能够被jvm执行,所以在编译为.class文件的过程中,对象的类型都会被指定好,比如说 User user.那么如果说我想在代码运行的过程中获取到对象的类型呢?或者说程序在运行过程

Java反射以及动态代理(上)

在常用的各种框架中,反射与动态代理很常见,也很重要.本篇就对这一小节的内容基础性地总结. 首先需要了解什么是类型信息,以及RTTI与反射的关系与区别. Java中,使用Class对象来表示所有类的对象.利用Class对象来获取类中的成员变量,构造函数以及方法,这些内容我们称之为类型信息.RTTI的含义是,在运行时识别一个对象的类型,但有一个前提,就是类型在编译时必须已知,这样才能用RTTI识别,并利用这些信息做一些有用的事情.但是如果在编译时,程序没有办法获知到这个对象所属的类,怎样才能使用这个

Java反射以及动态代理(下)-- 源码

承接上篇,本篇就主要介绍动态代理的实现机制. 首先说说怎么去实现一个动态代理.还是可以用一个接口,两种实现来概括,但是代理中的实现并不明显,后面详细看看源码. 接口: package com.changjiang.test.RFP01.testProxy; public interface DynamicInterface { public void testNoArgs(); public String testOneArgs(String name); } 原始实现类: package co

候捷谈Java反射机制

2013-06-12 22:51 1690人阅读 评论(0) 收藏 举报  分类: JAVA(51)  传送门:http://blog.csdn.net/njchenyi/article/details/1620939 摘要 Reflection是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等).superclass(例如Obj

反射机制-动态代理

目标: 掌握代理机制的作用 掌握InvocationHandler接口,和Proxy类的作用. 具体内容 代理设计,一个操作的接口有两个子类,其中一个是真实主题的实现类.另一个是代理实现类. 可以复习之前的代理设计模式: 接口与抽象类的应用(包括各自设计模式) 代理实现类需要完成比真实主题实现类更多的内容,而且本身还需要处理一些与具体业务有关的程序代码. 普通代理实例: package 类集; interface Subject{ public String say(String name,in