Java 反射 与 动态代理

[TOC]

反射

反射

Java是面向对象语言,Java编译生成的字节码文件应该也是一个对象,而这个对象不需要我们定义,

Java已经事先定义好了一个类叫做Class

Class类是用来描述现实事物的,是Java语言的最基本单位,类作为一个概念存在,概念本身也是一个对象

而我们使用Class类来描述这个概念类

反射的好处: 通过反射技术可以获取到字节码文件对象,

使用这个字节码文件对象就可以获取到一个类的所有信息,包括私有

【构造方法对象,成员变量对象,成员方法对象,访问权限修饰符对象...】

之前的做法:

Student s = new Student();

学习反射之后的做法: 可以不需要显示地出现学生类就能够创建学生类的对象,并且可以动态创建对象,动态赋值,动态调用方法

相关对象

Class 类对象

Constructor 构造方法对象

Method 成员方法对象

Field 成员变量对象

Modifier 访问权限修饰符对象

Array 数组对象

如何获取到堆区中的字节码文件对象?

三种方式:

1.通过Object类的getClass方法

缺陷: 必须要显示创建对象才能够获取到对应的字节码文件对象

2.通过数据类型的class属性

缺点: 必须在代码中进行硬编码,当生产环境下切换类的时候需要修改源代码

优点:

1.不需要创建对象

2.当一个方法的形参需要我们传入的是一个Class类型的时候,可以用方式二,很方便

public void method(Class c){}

method(Student.class);

3.通过Class类的一个静态方法 Class.forName()

static Class<?> forName(String className)

java.lang.ClassNotFoundException: Student

通过反射获取构造方法对象

Constructor<?>[] getConstructors() 获取到所有公有修饰的构造方法对象数组

Constructor<?>[] getDeclaredConstructors() 获取所有构造方法对象数组,包括私有

Constructor<T> getConstructor(Class<?>... parameterTypes) 获取单个公有修饰构造方法对象

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取所有单个修饰的构造方法对象,包括私有

通过反射获取成员变量对象

Field

Field[] getFields() 获取所有公有的成员变量对象,包括父类的公有成员

Field[] getDeclaredFields() 获取所有本类的成员,包括私有

Field getDeclaredField(String name) 获取公有的成员属性,包括父类

Field getField(String name) 获取所有本类属性,包括私有

通过反射获取成员方法对象,并且调用

Method[] getMethods() 获取所有公有修饰的成员方法对象,包括父类公有方法

Method[] getDeclaredMethods() 获取本类所有成员方法对象,包括私有方法

Method getMethod(String name, Class<?>... parameterTypes)

Method getDeclaredMethod(String name, Class<?>... parameterTypes)

通过反射读取配置文件,动态地调用任意对象的任意方法

动态创建对象,动态调用方法

  • StudentManager
  • TeacherManager

通过反射获取数组对象并且赋值

  • Array

动态代理

动态代理

动态代理的本质就是在代理对象方法调用之前或者之后加入一些通用的方法

面向切面编程就是代理模式的应用,也是AOP的基础

面向切面编程是面向对象的一种方式,在代码的执行过程当中,动态嵌入其他代码,成为面向切面编程

常见的应用场景:

1.日志

2.事物

3.数据库操作

面向切面编程的几个概念:

AOP本质就是动态代理

1.切点(PointCut): 要对哪些连接点进行拦截的定义,即要添加代码的地方 例如info作为切点

2.连接点(JointPoint): 类里面可以被增强的方法,这些方法称为连接点 (例如: info run add 三个连接点)

3.增强(通知)(Advice): 指的是拦截到JoinPoint之后所要做的事情就是通知,即向切点插入的代码片段称为通知

通知的分类: 前置通知,后置通知,异常通知,最终通知,环绕通知(后面讲解)

4.目标对象(Target): 代理的目标对象,这里就是target

5.织入(Weaving): 是把增强应用到目标的过程,即Advice应用到Target的过程

6.代理(Proxy): 一个类被AOP织入增强后,就会产生一个结果代理类

7.引介: 引介是一种特殊的通知在不修改源代码的前提下,可以在运行时期为类动态地加入一些方法或者字段

代理模式

代理模式: 23种设计模式的一种

静态代理

动态代理

通过代理对象,去控制对真实对象的访问

例如: 经纪人, 租房的中介

代理模式的作用: 可以通过代理对象去控制真实对象中的方法,代理对象就可以具备调用真对象的所有方法的调用控制权

我们就可以在调用方法之前做一些前置处理,之后做一些后置处理

动态代理:可以在不在修改源代码的基础动态地加入代码

租房: 1.看安居客app

2.到处走走看看

3.谈价钱....

中介来处理

存在真实对象的引用

1.看安居客app

2.到处走走看看

3.谈价钱....

4.过来交钱

5.后续合作

这些方法设计成为接口

为什么称为静态代理?

这里的代理对象由我们自己来实现的,而JDK中提供了一个类Proxy类能够动态地帮助我们创建代理对象或者代理类

Proxy.getProxyClass(loader, interfaces) 动态获取代理类

Proxy.newProxyInstance(loader, interfaces, h) 动态获取代理对象

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容