Java 反射 与 动态代理

偏执的太偏执、 2022-02-04 13:17 387阅读 0赞

文章目录

    • 反射
    • 动态代理
    • 代理模式

反射

反射

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 getConstructor(Class<?>… parameterTypes) 获取单个公有修饰构造方法对象

Constructor 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) 动态获取代理对象

发表评论

表情:
评论列表 (有 0 条评论,387人围观)

还没有评论,来说两句吧...

相关阅读

    相关 反射动态代理

    实例说明   代理是Java SE 1.3版新增的特性。使用代理可以在程序运行时创建一个实现指定接口的新类。通常只有在编译时无法确定需要使用哪个接口时才需要使用代理,这

    相关 Java反射动态代理

          与[javax.lang.model][] 不同的是,通过反射API可以获取程序在运行时刻的内部结构。反射API中提供的动态代理也是非常强大的功能,可以原生实现[A

    相关 java反射动态代理静态代理

    静态代理弊端: 之前博客中有讲静态代理机制的,特征是代理类和目标对象的类都是在编译期间确定下来的,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必

    相关 反射机制动态代理

    以前学习基础的时候不知道哪些是重点,也不会注意,自己动手少,用的少,自然也不会知道,就落下了知识点,当被问反射机制起来时,听过,但怎么说,到底是怎么一回事,脑子一片空白,答不上