反射

反射概述 反射:框架设计的灵魂框架:半成品软件,可以在的框架的基础上进行软件开发,简化代码反射:将类的各个组成部分分装为其他的对象,这就是反射机制要想知道反射,得先了解java代码在计算机中经历了那些阶段01 类的加载 当程序要使用某个类的时候,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化,三步来实现对这个类进行初始化 * 加载 > 就是指将class文件读入内存,并为之创建一个Class对象 > 任何类被使用时,系统都会创建一个Class对象 * 连接 > 验证: 是否有正确的内部结构,并和其他类协调一致 > 准备: 负责为类的静态成员分配内存,并设置默认初始化之 > 解析: 将类的二进制数据中的符号引用替换为直接引用* 初始化: 就是我们以前讲过的初始化步骤02 类的加载时机(类的初始化时机) * 创建类的实例 * 方法类的静态变量,或者为静态变量赋值 * 调用类的静态方法 * 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 * 初始化某个类的子类* 直接使用java.exe命令来运行某个主类的时候03 类加载器的概述类加载器就是负责将.class文件加载到内存中,并为之生成对应的的Class对象解释:我们曾经用过一个类,叫做String,这个类是我们写的吗,是不是jdk提供给我们的,我们曾经有一个学生类,这个是我们写的吧,但是系统有提供的类,我们自己乜有类,那么他们的加载会是同一个加载器吗?有没有可能呢?这个时候我们就能想到类的加载器是有不同的作用的,有的专门负责加载系统的,有的负责加载我们的,所以我接下来就要讲的就是加载器的分类04 类加载器的组成Bootstrap ClassLoader 根类加载器Extension ClassLoader 扩展类加载器System ClassLoader 系统类加载器05 类加载器的作用* BootStrap ClassLoader 根类加载器乜被称为引导类加载器,负责Java核心类的加载,比如System.String等,在JDK中 jre的 lib目录下rt.jar文件中* Extension ClassLoader 扩展类加载器,负责jre的扩展目录中jar包的加载,在JDK中jre的lib目录下ext 目录中* System ClassLoader 系统类加载器 负责在JVM启动时加载来自Java命令的class文件,以及classpath环境变量所指定 的jar包和类路径06 反射概述Java反射机制都是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制要想解剖一个类,必须先要获取到该类的字节码文件对象,而解剖使用的Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型对象,Class文件对象又是个啥呢?这里讲完可能有点懵逼,简单解释,反射就是指,我们现在有的class文件,然后你拿到class文件去使用它的成员变量,构造方法,成员方法,不是说拿的Java文件07 Class文件对象其实乜就是得到Class对象,java.lang.Class 类是Java中的反射中心Class类的一个对象表示运行时程序中的一个类Class 类是一个通用类,它需要一个类型参数,它是由 Class 对象表示的类的类型例如, Class 表示布尔类的类对象Class类:成员变量:Field(类)构造方法:Constructor(类)成员方法:Method(类)得到这个类的对象,通过这个类的对象去调方法使用该方法这叫反射那么如何获取这个Class对象呢?08 获取类的Class对象//1、第一种Class c1= Dht.class;//2、第二种Class c2 = Class.forName(“org.serr.Dht”);//3、第三种Class c3 = new Dht().getClass();
* 使用类文字
* 使用Object类的getClass()方法
* 使用Class类的forName()方法

类文字类文字是类名称后跟一个点和单词类簓"。例如,如果你有一个类 Test ,它的类文字是 Test.class 你可以写Class testClass = Test.class;getClass()方法Object类有一个 getClass()方法,它返回对的引用类对象的类对象以下代码显示如何获取对Test类的Class对象的引用class Test{}public class Main {public static void main(String[] args) {Test testRef = new Test();Class testClass = testRef.getClass();}}forName()方法Class类 forName() static方法返回对Class对象的引用forName()方法接受完全该类的限定名作为参数,并加载该类,并返回其对象引用如果类已经加载,它将返回对Class对象的引用要加载名为com.bdqn.beans.Test的类:Class testClass = Class.forName(“com.dbqn.beans.Test”);09 通过反射获取构造方法并使用定义实体类Studnetclass Dht{private String name;private Integer age;private Character sex;public Dht() {}public Dht(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Character getSex() {return sex;}public void setSex(Character sex) {this.sex = sex;}10 通过反射去获取有参构造方法并使用/构造方法/@Testpublic void test5() throws Exception {Class c = Dht.class;Constructor[] cs = c.getDeclaredConstructors();for (Constructor css:cs){System.out.println(css.getName());}Constructor constructor = c.getConstructor(String.class, Integer.class, Character.class);Object o = constructor.newInstance(“dht”, 21, ‘男’);}11 通过反射获取成员变量并使用Class c=Dht.class;//获得所有属性方法Field[] fies = c.getDeclaredFields();for(Field f:fies){System.out.println(f.getName());}Object o = c.newInstance();//获得单属性方法Field name = c.getDeclaredField(“age”);System.out.println(name);name.setAccessible(true);name.set(o,“dht”);System.out.println(name.get(o));13 通过反射获取方法并使用 13.1通过反射获得方法的信息 @Testpublic void test1() throws Exception {Class c1= Teacher.class;Method eat = c1.getDeclaredMethod(“eat”);//1、方法信息System.out.println(“方法名:”+eat.getName());//1、2访问修饰符int mf = eat.getModifiers();if((mf& Modifier.PUBLIC)==Modifier.PUBLIC){System.out.println(“是public的方法”);}if((mf& Modifier.PRIVATE)==Modifier.PRIVATE){System.out.println(“是public的方法”);}//得到方法的参数列表Class[] csarr=eat.getParameterTypes();if(csarr.length<=0){System.out.println(“无参构造方法”);}else{for(Class c:csarr){System.out.println(“参数”+c.getName());}}//方法的返回值类型Class returntype=eat.getReturnType();System.out.println(“返回值类型:”+returntype.getSimpleName());System.out.println("--------------------------");//得到方法} 13.2通过反射得到方法并调用使用 @Testpublic void test5() throws Exception {Class c = Dht.class;Constructor[] cs = c.getDeclaredConstructors();for (Constructor css:cs){System.out.println(css.getName());}Constructor constructor = c.getConstructor(String.class, Integer.class, Character.class);Object o = constructor.newInstance(“dht”, 21, ‘男’);constructor.setAccessible(true);Method toString = c.getMethod(“toString”);Object invoke = toString.invoke(o);System.out.println("--------------");c.getMethod(“setName”, String.class).invoke(o,“HDT”);Object getName = c.getMethod(“getName”).invoke(o);System.out.println(“getname:”+getName);System.out.println(invoke);}
使用反射的好处(案例)
在BaseDao中有query通用的查询方法,可右键查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值