定义:)ArrayList<E> : <>typeof E:类型形式参数 (用带有泛型的类:)new ArrayList<Integer>() Integer:类型实际参数 ArrayList<E> :泛型类型 ArrayList<Integer> :参数化的类型 (在Java中是有一个类型来表示的ParameterizedType)
1. 如何定义一个自己的泛型,用T代表一个泛型类型 2. 泛型使用前要先声明,声明的位置在返回值之前,用<T>进行声明 3. 当一个类的实例方法都是用泛型时,可以进一步简化,就是将这个类声明泛型类 4. 如何声明一个类为泛型类? 就是在类声明时,同时在类名后加上<T> 5. 如果一个类声明泛型类,内部实例方法就不用声明泛型了 6. 如果一个类声明泛型类,静态方法必须声明泛型 public static <T> T fillBean(Map map, Class<T> clazz) throws Exception {//静态方法,不管类有没有声明泛型,静态方法必须声明泛型 T bean = clazz.newInstance(); BeanUtils.populate(bean, map); return bean; }
1. 编写一个泛型,实现指定位置交换 public static <T> void swap (T t[], int x, int y) { T temp = t[x]; t[x] = t[y]; t[y] = temp; } 2. 将任意数组反转 public static <T> void reverse(T t[]) { for(int start=0, end=t.length-1; start<=end; start++,end--) { swap(t,start,end); } }
Class clzz1 = this.getClass();//this指代当前的类 在测试类JDaoTest中,new CustomerDaoImpl();的是谁,this就指谁 //2.找当前clzz1的泛型父类 Type type = clzz1.getGenericSuperclass(); ParameterizedType pt = (ParameterizedType)type; //3.找泛型父类的参数的Class clz = (Class)pt.getActualTypeArguments()[0];//取数组的下标为0的值
JDK中自带的注解 @Override //JDK1.6+才能使用接口中方法重写时的override @Override //JDK1.5+才能使用父类中方法重写时的override @Deprecated //代表该方法已过时,可能有更好的方法替代 在系统更新维护很有用 @SuppressWarnings({ "all" })//消除一些警告信息"unused", "rawtypes", "unchecked" 如何自定义注解 1. 如何定义注解 public @interface 注解的名称{} 2.注解中能写什么? 1). 只能写属性 1.必须是一个公有的 2.属性后面要加一个() 2). 如果要加默认值 default 默认值 如:public int a() default 1; 3). 注解中只能写什么类型的属性? only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays 基本类型 Class 注解 枚举 以及它们构成的一维数组
1. 注解获取方式 java.lang.reflect.AnnotatedElement T getAnnotation(Class clazz):得到指定的注解类型 Annotation[] getAnnotations():得到所有的注解类型 Annotation[] getDeclaredAnnotations():得到自己上面的直接的注解类型 boolean isAnnotationPresent(Class clazz):有没有指定的注解 Class、Method、Field、Constructor等都实现了该接口。 比如:Class clazz = Object.class; Boolean b = clazz.isAnnotationPresent(MyAnn1.class); 判断Object这个类上面有没有MyAnn1的注解 2、注解的生命周期: 2.0元注解:只能用在注解上的注解,就是元注解。 2.1@Retention:改变注解的生命周期 RetentionPolicy.SOURCE RetentionPolicy.CLASS(默认的) RetentionPolicy.RUNTIME 2.2@Target:指示注解能用在何处 ElementType:枚举 2.3@Documented:注解是否出现在JavaDoc文档中 2.4@Inherited:使用了注解的类的子类是否自动拥有注解
1.使用Servlet3.0前提条件? JDK1.6+ Tomcat7.0或以上 2.Servlet注解配置 @WebServlet() @WebServlet(value={"/servlet/HelloServlet","/1.jpg"},initParams={@WebInitParam(name="encoding",value="UTF-8") ,@WebInitParam(name="cgx",value="aj") //ServletConfig可以取出注解中的初始化参数 ServletConfig sconfig = getServletConfig(); String encodingValue = sconfig.getInitParameter("encoding"); System.out.println(encodingValue); //获取多个初始化参数 Enumeration<String> enumsss =sconfig.getInitParameterNames(); while (enumsss.hasMoreElements()) { String paramName = (String) enumsss.nextElement();//得到参数名 String paramValue = sconfig.getInitParameter(paramName); System.out.println(paramName+":"+paramValue); } 3.Servlet注解配置实现文件上传 commons-fileupload-xxx.jar是Apache Tomcat也是Apache------------->Tomcat7.0+集成了文件上传的功能(使用这个功能,就是加一个注解) @MultipartConfig @MultipartConfig //代表当前的这个Servlet有能力处理文件上传的功能 Part--------->request.getPart("filename").write("磁盘路径“); 示例:文件上传时的相关代码 response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8");//解决普通字段的乱码问题 <input type="text" name="username"/> String username = request.getParameter("username"); response.getWriter().write(username); //文件上传 Part part = request.getPart("photo1");//<input type="file" name="photo1"> //由相对路径images,得到绝对路径 getServletContext().getRealPath("/images"):返回c:/tomcat7/webapps/day22/images/1.jpg part.write(getServletContext().getRealPath("/images")+File.separator+i+".jpg"); response.getWriter().write("文件上传成功,<a href=‘"+request.getContextPath()+"/01upload.jsp‘>返回</a>"); 4.Listener配置:@WebListener 5.过滤器的注解配置 @WebFilter 注意://多个过滤器的顺序问题?看过滤名字的字典序
1. 它是什么? Log for Java 主要用于记录日志信息的 (谁在什么时候用哪台机器登录我的网站) 文件(IO)或数据库(sql) 2.用一种最快捷的方式 实现日志信息的保存 3.平时Log4j用在哪些地方? 取款(sql (执行减法),取款机出钱)------>异常(Log4j记录日志 (id=324323取款 1000 ,ATM机没有出钱) ---->相反的操作) 权限日志,异常日志 4.开发中如何使用日志? 1.log4j-xxxx.jar包 2.写配置文件 默认(src/log4j.properties) 3.使用 5. log4j使用 log4j.properties可以在MyEclipse中目录搜索选择apache目录下的log4j.properties #log4j.rootCategory=INFO, CONSOLE, LOGFILE 这里可以把注释去掉,启用文件日志 log4j.appender.LOGFILE.File=axis.log 指定日志存放的目录 模版日志格式log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
Hibernate入门,是轻量级应用的持久层解决方案 1. ORM映射工具:JavaBean--->数据库 2. 通过操作JavaBean,相当于操作数据库 Hibernate环境搭建 1. 导包 拷贝Hibernate发型包\hibernate3.jar(1个) 拷贝Hibernate发型包\lib\required下的所有jar(6个) 拷贝Hibernate发型包\lib\jpa下的jar(1个) 拷贝Log4j的核心jar包(1个) 拷贝slf4j发型包\slf4j-log4j12-*.jar(1个) 还有你的数据库驱动jar(MySQL就1个) 如果用到日志,拷贝Hibenate发型包\project\etc\log4j.properties到构建路径中 第一个入门案例 1. 创建数据库表和实体 private Integer id; private String name; private Date birthday; 2. 在实体类所在的包中,创建Java对象与数据库的映射文件。文件名为"实体类名-hbm.xml" 可以参考hibernate发行包下搜索*.hbm.xml 3. 框架连接数据库 在类路径中创建Hibernate的配置文件hibenate.cfg.xml,并告知映射文件的路径(参考Hibernate发型包\project\etc\hibernate.properties) url、用户名、密码、连接池大小、方言、当前线程对象绑定、二级缓存、控制台是否显示sql 是否创建表结构、映射文件在哪 4. 工具类 5. PersonDaoDemo/CRUD ----------------------------------------------------------------------- Dao设计模式 原始重复代码 1. PersonDao接口 2. CustomerDao接口分页 3. 两个实现接口 改写 1. 抽取公共Dao定义泛型T,方法CRUD void add(T t); void update(T t); void delete(Serializable pk); T findOne(Serializable pk); 2. CustomerDao继承Dao<Customer> 特有方法List<Customer> findAll(); 3. 实现类抽取BaseDao<T>实现Dao<T> 3.1 工具类HibernateUtil 3.2 clazz依赖注入,使用泛型反射,反射到父类泛型 3.3 CRUD方法:增加开启事务, 增加 Session s = HibernateUtil.getSession(); Transaction ts = s.beginTransaction(); s.save(t); ts.commit(); s.close(); 查找 Session s = HibernateUtil.getSession(); T bean = (T) s.load(clazz, pk); return bean; 4. 实现类,继承BaseDao,实现Customer接口 5. 修改配置文件 6. 测试
原文:http://www.cnblogs.com/codingpark/p/4280742.html