一、反射
1. 内加载机制
1. 加载字节码文件到内存(字节码文件当成模板)
2. 把静态(方法,字段,代码块)初始化(公共部分准备好)
3. 如果创建对象的时候,会从模板区域找
2.Class获取的三种方式
1.Class.forName(全路径);
2.对象.getClass() ( this.getClass() )
3.类名.class
2. 字节码
1.字段Field
常用方法:getField(字段名name) 获取指定字段(字段为public)
getDeclareField(字段名 name) 获取指定字段 (字段为private)
例如:
/*1.获取Class对象*/
Class<?> clazz = Class.forName("com.huaxin.crm.bean.HxUser");
/*2.创建对象*/
HxUser object = (HxUser) clazz.newInstance();
/*3.获取public字段*/
Field field = clazz.getField("num");
field.set(object, 19);
/*4.获取private字段*/
Field field2 = clazz.getDeclaredField("str");
/*5.设置访问权限*/
field2.setAccessible(true);
field2.set(object, "王麻子");
2.构造方法 Constructor
常用方法:getConstructor(参数的class类型) 获取指定的构造方法(构造方法为public)
getDeclareConstructor(参数的class类型) 获取指定的构造方法 (构造方法为private)
例如:
// 1.获取Class对象
Class<?> clazz = Class.forName("com.huaxin.crm.bean.HxUser");
// 2. 获取构造方法
Constructor<?> constructor = clazz.getConstructor(String.class);
constructor.newInstance("张三");
3.方法 Method
常用方法:getMethod(方法名name,参数的class类型) 获取指定的方法(方法为public)
getDeclareMethod(方法名name,参数的class类型) 获取指定的方法 (方法为private)
例如:
// 1.获取Class对象
Class<?> clazz = Class.forName("com.huaxin.crm.bean.HxUser");
// 2.获取构造方法
Constructor<?> constructor = clazz.getConstructor(String.class);
// 3.创建对象
Object object = constructor.newInstance("张三");
// 4.获取方法
Method method = clazz.getMethod("addnum", int.class);
method.invoke(object, 18); //第一个参数为对象,表示调用哪个对象的方法,第二个是参数
注意:当获取私有字段或者方法时,要设置其访问权限,setAccessible(true), 否则私有方法或者字段不可访问
二、数据库优化
1.硬编码优化
加载驱动(1)、获取链接(3)
(1)首先在项目下创建一个文件
(2)文件内容格式为 keyname = value
(3)类名.class.getClassLoad().getResourceAsStream(“文件名”);
注意:如果文件直接建立在src下,则直接填写文件名。建立在包下面,则前面要加上相应的包名
(4)创建Properties对象
(5)加载字节码 Properties对象.Load(InputStream in)
(6)获取getProperties(keyname)
2. 数据库增删改优化
增删改公共部分: 获取Connection连接、结果查询executeUpdate()
不公共部分: sql执行语句
优化: 在jdbc中创建一个Update(String sql, Object ... objects);
其中sql 为数据库执行语句、 Object ... objects 为可变数组
3. 数据库查询优化
不公共部分:sql语句,结果集resultSet的处理(返回一个对象、集合、一列数据)
优化:在jdbc中创建一个Query(String sql,ResultHandle handle, Object ... objects)
其中sql 为数据库执行语句、ResultHandle handle 为对结果集的处理,根据调用者的需求是返回一个对象、集合还是一列数据、 Object ... objects 为可变数组
对返回单个对象的处理
其中:resultSet.getMetaData() 为获取数据库中的数据源
通过数据源metaData.getColumnCount()可以获取有多少列数据
通过数据源metaData.getColumnName(int i)可以获取每一列的列名
对返回对象集合的处理
对一列数据的处理
其中:str为要查询的那一列的列名