反射及代理

本文详细介绍了Java反射机制,包括如何获取类的属性、方法和构造器,并讨论了反射在降低耦合中的作用。此外,还阐述了动态代理的概念,包括基于接口和基于子类的动态代理实现,以及它们在不修改源码基础上对方法增强的应用。最后,提到了类加载器、JavaBean规范以及在MySQL中大小写敏感性的注意事项。
摘要由CSDN通过智能技术生成

反射(动态性)

一.反射概述

  • 反射的动态性

主要就是体现在,编译不报错,运行时在根据所给的信息生成对应的运行时对象(加载进内存的对象就是运行时).

1.反射机制:

  • 众所周知我们创建对象的过程是:

引入需要的“包类”名称 -->通过new实例化对象 -->获得对象

  • 而反射的过程是:

通过对象 -->获得所在的类 -->通过所在类名-->可知在那个包下所构造的

2.通过反射获取 属性、方法、构造器

2.1属性
  • getFiled()

获得public修饰的指定的属性,然后用Filed来接收并且可以设置或者获取属性值

  • getFileds()

获得public修饰的本类及其父类的属性,返回Filed类型的数组

  • getDeclareFiled()

获得指定无论任何修饰权限的属性

注意:当获取到private修饰的属性,如果要修改它我们需要调用”属性名.setAccessible(true)“,才可以修改。即将属性改为可访问的

  • getDeclareFileds()

获取本类全部的属性

2.2方法
  • 概述

同理如变量,只需要把Filed关键字换为Method;get**方法传入的参数都是对应方法传入参数的class字节码(例如String.class)

2.3构造器
  • 概述

同理如变量,只需要把Filed关键字换为Constructor;get**方法传入的参数都是对应构造器传入参数的class字节码(例如String.class)

  • getConstructors()获取当前运行时类中声明的public构造器
  • getDeclareConstructors() 这是获得当前运行时全部的权限修饰的构造器

注意:以上方法加s的返回都是一个对应类型的数组

2.4Class的理解

Class实例对应着加载到内存中的一个运行时类

3.耦合

3.1什么叫耦合

程序间的依赖关系:

  1. 类之间的依赖
  2. 方法之间的依赖

3.2解耦

降低程序间的依赖关系步骤:

  1. 使用反射来创建对象,避免使用new关键字
  2. 通过读取配置文件来获取要创建的对象全限定类名

二.动态/静态代理

2.1代理概述

可以简单理解为经销商和生产厂家之间的关系

2.2动态代理:

注意:两种代理方式都有涉及到匿名内部类访问外部成员变量时,该变量的setter方法要求加final关键字

  • 特点:字节码随用随创建,随用随加载
  • 作用:不修改源码的基础上对方法增强
  • 分类:
    • 1.基于接口的动态代理
      2.基于子类的动态代理基于接口的动态代理:
2.2.1基于接口的动态代理

注意:建立完对象后的返回的对象一定要进行多态的改造,也就是要用实现类的接口来接收创建,并在后面进行强转

  • 涉及的类:Proxy 提供者:JDK官方
  • 如何创建代理对象:
    使用Proxy类中的newProxyInstance方法
  • 创建代理对象的要求:
    被代理类最少实现一个接口,如果没有则不能使用
  • newProxyInstance方法的参数:
    1、ClassLoader:类加载器
    它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法。
    2、Class[]:字节码数组
    它是用于让代理对象和被代理对象有相同方法。固定写法。
    3、InvocationHandLer:用于提供增强的代码
    它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。此接口的实现类都是谁用谁写。
    过程就是重写其中的invoke方法:
    • 作用:执行被代理对象的任何接口方法都会经过该方法
    • 方法参数的含义
      • invoke方法的参数及返回值:
        1、proxy:代理对象的引用
        2、method:当前执行的方法
        3、args:当前执行方法所需的参数
        @、return:和被代理对象方法有相同的返回值
2.2.2基于子类的动态代理

注意:由于不存在接口了,所以接收的对象子类是什么就用什么,然后进行类型强转

  • 涉及的类:Enhancer 提供者:第三方jar包(cglib)
  • 如何创建代理对象:
    使用Enhancer类中的create方法
  • 创建代理对象的要求:
    被代理类不能是最终类
  • create方法的参数:
    1、Class:字节码
    它是用于指定被代理对象的字节码。
    2、Callback:用于提供增强的代码
    它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。此接口的实现类都是谁用谁写。
    过程就是重写该类的子类MethodInterceptorintercept方法:
    • 作用:执行被代理对象的任何方法都会经过该方法
    • 方法参数的含义
      • intercept方法的参数及返回值:
        1、proxy:代理对象的引用
        2、method:当前执行的方法
        3、args:当前执行方法所需的参数
        4、methodProxy:当前执行方法的代理对象
        @、return:和被代理对象方法有相同的返回值

三.杂七杂八

一个字节码文件对应一个类

3.1类加载器(ClassLoader)

分类:

  1. 引导类加载器
  2. 扩展类加载器(加载核心类库)
  3. 系统类加载器(平时自己写的类就是用这个加载的)
  4. 自定义加载器
    注意:前三个是有父子类关系,由下至上越来越底层,对应方法getParent

作用:用来把类(class)装载进内存的

3.2获取类的字节码文件的三种方式

  1. 类名.class
  2. new 类名;类名.getClass();
  3. Class.forName(全类名地址)

3.3运行时对象

创建一个运行时类的对象:

Person person = new Person();
Class clazz = person.getclass();
//用newInstance创建运行时对象
Object o = clazz.newInstance();

newInstance();调用该方法必须满足:

  1. 运行时类必须提供空参构造器
  2. 空参构造器访问权限一般为public

3.4JavaBean

定义:用java语言编写的可重用组件
在JavaBean中一般提供空参构造器的原因:

  1. 便于通过反射,创建运行时对象
  2. 便于子类继承运行时对象类,默认调用super()时,保证父类有此构造器

3.5invoke()方法

invoke方法的返回值就是类中调用方法的返回值,如果类中所调用的方法中没有返回值则返回null

3.6MySql

在window下的MySQL数据库是不区分大小写的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值