发表于: 2017-11-09 22:41:52
2 831
今天完成的事情:
主要是围绕JDBC进行学习, 在学习JDBC的时候发现需要反射的内容,所以下午将反射的知识大概的了解了一下.
A:反射概述
* JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
* 对于任意一个对象,都能够调用它的任意一个方法和属性;
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
* 要想解剖一个类,必须先要获取到该类的字节码文件对象。
* 而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
* B:三种方式
* a:Object类的getClass()方法,判断两个对象是否是同一个字节码文件
Class c1 =Object.getClass()
* b:静态属性class,锁对象
Class c2 = Object.class
* c:Class类中静态方法forName(),读取配置文件
Class c3 = Class.forName("java.lang.Object")
c1==c2 c2==c3 都是true, 说明这三种方式获得的字节码文件都是同一个
反射的一大特点, 忽视私有, 以及忽视泛型很不错.
在泛型为integer的几个中插入字符串.
在自定义类中没有提供相应的set()get()方法,通过反射暴力修改.
在Democlass类中私有了run方法
在运行类里通过反射,暴力调用私有的这个方法.不过在编译运行的时候发现一个问题,如果我不提前把提供字节码文件的类先编译, 在运行类中是无法通过反射的编译以及运行的,
由此让我对反射的思路有了更清晰的认知, 说明反射是对.class文件本身进行操作,生成对象, 已以及暴力修改成员变量,调用私有方法, 都是一个反编译的过程.
明天计划的事情:
因为今天精神状态不是很好, 下午敲反射的代码的时候,报错不少, 明天上午对反射再巩固一下,然后下午进行junit4的学习
收获:知道如何对一个字节码文件进行操作了.(是否意味着可以在脱离java文件的情况下操作别人给的.class文件?)
评论