1.本周思维导图
2.个人总结
反射:
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
//反射操作List的add方法
Class extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
add.setAccessible(true);
Object result = add.invoke(list, "hello , generic type !");
System.out.println(list);
public static void setValue(Object obj , String fieldName , Object value) throws Exception {
Class> clazz = obj.getClass();
//根据属性名称获取对应的set方法名称
String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
Field field = clazz.getDeclaredField(fieldName);
//获取字段的数据类型
Class> fieldType = field.getType();
//获取到set方法对象
Method method = clazz.getMethod(methodName, fieldType);
//执行set方法
method.invoke(obj , value);
}
Properties properties = new Properties();
//将bean.properties中的数据存储到inputStream中
InputStream inputStream = Demo11.class.getClassLoader().getResourceAsStream("bean.properties");
//将bean.properties中的数据绑定到了Properties中!
properties.load(inputStream);
//获取全类名
String className = properties.getProperty("bean01");
//根据上述全类名创建了一个对象!
Object obj = Class.forName(className).newInstance();
System.out.println(obj);
//根据上述全类名创建了一个对象!
String className2 = properties.getProperty("bean02");
Object obj2 = Class.forName(className2).newInstance();
System.out.println(obj2);
设计模式:
//1、自定义一个代理类(增强类)实现和被代理类(被增强类)相同的接口
public class UserDaoImplProxy implements UserDao{
//2、在代理类中声明被代理类的引用
private UserDao userDao ;
public UserDaoImplProxy(){
userDao = new UserDaoImpl();
}
@Override
public void addUser() {
//3、在代理类的方法中使用被代理类调用方法
System.out.println("权限校验");
userDao.addUser();
System.out.println("日志记录");
}
@Override
public void deleteUser() {
userDao.deleteUser();
}
@Override
public void updateUser() {
userDao.updateUser();
}
@Override
public void selectUser() {
userDao.selectUser();
}
}
//1、定义装饰类(增强类)实现和被装饰类(被增强类)相同的接口
public class UserDaoWrapper implements UserDao {
//2、在装饰类中声明被装饰类的引用
private UserDao userDao ;
public UserDaoWrapper(){
}
public UserDaoWrapper(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser() {
System.out.println("权限校验");
userDao.addUser();
System.out.println("日志记录");
}
@Override
public void deleteUser() {
userDao.deleteUser();
}
@Override
public void updateUser() {
userDao.updateUser();
}
@Override
public void selectUser() {
userDao.selectUser();
}
}
UserDao userDao = new UserDaoImpl();
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取到接口中方法对象 , 比如 : UserDao接口中addUser方法
//之前
//先获取实现子类的Class对象
//再获取到接口的Class对象
//再获取到接口中的方法对象
//现在
//再获取到接口的Class对象 -- userDao.getClass().getInterfaces(),
//再获取到接口中的方法对象 -- Method method
//method : 就是接口中的方法对象
Object returnValue = null;
if (null != method) {
boolean present = method.isAnnotationPresent(SystemLog.class);
if (present) {
//如果有@SystemLog注解 , 执行原有功能 , 打印日志
returnValue = method.invoke(userDao, args);
String currentTimeStr = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss")
.format(new Date());
SystemLog systemLog = method.getAnnotation(SystemLog.class);
String className = systemLog.className();
String methodName = systemLog.methodName();
System.out.println(currentTimeStr + " --- " + className + "类中 ---" + methodName + "()方法 --- 运行了");
} else {
//如果没有@SystemLog注解, 执行原有功能, 不打印日志
returnValue = method.invoke(userDao, args);
}
}
return returnValue;
}
});
userDaoProxy.addUser();
自定义连接池:
public class MyDataSource {
int initPoolSize = 3;
LinkedList connections = new LinkedList<>();
public MyDataSource(){
createConnections();
}
public void createConnections(){
for (int i = 1 ; i <= initPoolSize ; i++) {
try {
Connection connection = JDBCUtils.getConnection();
connections.add(connection);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 取出连接
* @return
*/
public Connection getConnection(){
//连接池中的连接够用
if (connections.size() == 0 || connections.isEmpty()) {
//连接池中的连接不够用 , 新建一些连接存储连接池中
createConnections();
}
Connection connection = connections.remove(0);//普通连接对象
//根据普通连接对象 获取 一个连接代理对象(增强连接对象)
Connection connectionProxy = (Connection) Proxy.newProxyInstance(
connection.getClass().getClassLoader(),
connection.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//处理增强close方法
String methodName = method.getName();
Object returnValue = null;
if ("close".equals(methodName)) {
//如果是close方法,归还连接
returnValue = connections.add(connection);
} else {
//如果不是close方法,就执行原有功能
returnValue = method.invoke(connection, args);
}
return returnValue;
}
});
return connectionProxy;
}
}
request操作请求参数:
//获取指定参数值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username : " + username + " , password : " + password);
System.out.println("---------------");
//获取所有请求参数名称
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement();
String parameterValue = request.getParameter(parameterName);
System.out.println("name : " + parameterName + " , value : " + parameterValue);
}
System.out.println("---------------");
//获取指定请求参数所有值
String[] usernames = request.getParameterValues("username");
System.out.println(usernames[0]);
String[] hobbys = request.getParameterValues("hobbys");
for (String hobby : hobbys) {
System.out.println(hobby);
}
System.out.println("---------------");
//获取请求参数对应的map :Map(String,String[])
//键:请求参数名称 相当于 getParameterNames
//值:一组请求参数值 相当于 getParameterValues
Map parameterMap = request.getParameterMap();
Set> entrySet = parameterMap.entrySet();
for (Map.Entry entry : entrySet) {
//键 - 请求参数名称
String parameterName = entry.getKey();
//值 - 一组请求参数值
String[] values = entry.getValue();
StringBuffer valueStr = new StringBuffer();
for (String value : values) {
valueStr.append(value + " ");
}
System.out.println("参数名称 : "+ parameterName + " , 参数值 : " + valueStr);
}