java基础回顾与增强


    java基础回顾加强目录
    基础回顾 1
    11 集合 1
    111 集合类型特性 1
    112 遍历集合 1
    1121 遍历集合种方式 1
    1122 遍历数组 2
    1123 遍历List 2
    1124 遍历Set 3
    1125 遍历Map 3
    12 泛型(Generic) 4
    121 泛型方法 8
    122 泛型类 9
    123 泛型接口 12
    13 IO流 13
    131 IO流分类 13
    132 读文件代码 13
    133 拷贝文件代码 14
    14 线程 15
    141 启动线程方式 15
    142 代码 15
    二Junit单元测试 16
    21 Junit单元测试框架基 16
    22 Assert断言工具类 17
    23 准备环境清理环境方法 17
    三省(Introspector) 18
    四Properties类配置文件 20
    41 Properties配置文件说明 20
    42 加载配置文件 21
    43 写配置文件 21
    44 Properties类 22
    五文件路径 22
    51 绝路径 22
    52 相路径 23
    53 Java程序中相路径 23
    54 classpath路径 23
    541 classpath路径说明 23
    542 获取classpath中资源(InputStream) 24
    六基础增强 24
    61课程回顾 24
    62 泛型 25
    621 概述 25
    622 泛型方法泛型类泛型接口 26
    623 泛型关键字 28
    624 泛型反射 30
    63 反射复 32
    64 注解 35
    641 概述 35
    642 定义注解 36
    a 注解基写法 36
    b带默认值注解 36
    b默认名称注解 37
    643 元注解 38
    645 注解反射 38
    65 注解优化BaseDao代码 39
    66 Log4J日志组件 39


    基础回顾
    11 集合
    111 集合类型特性
    |Collection 单列集合
    |List 存储序 重复
    |ArrayList 数组实现 查找快 增删慢
    数组实现 增删时候会牵扯数组
    增容 拷贝元素 慢数组直接索引查找 查找时较快
    |LinkedList 链表实现 增删快 查找慢链表实现 增加时前元素记住 删时前元素记住元素 元素记住前元素 样增删效率较高查询时需遍历 效率较低
    |Vector ArrayList原理相 线程安全 效率略低
    ArrayList实现方式相 考虑线程安全问题 效率略低
    |Set 存储序 重复
    |HashSet 线程安全存取速度快底层哈希表实现
    |TreeSet 红黑树数结构默认元素进行然排
    序(String)果较时候两象
    返回值0元素重复
    | Map 键值 键重复键重复
    |HashMap 线程安全存取速度快底层哈希表实现
    |TreeMap 红黑树数结构默认元素进行然排
    序(String)果较时候两象
    返回值0元素重复
    |HashTable 底层哈希表 维护存取读取快存储元素


    112 遍历集合
    1121 遍历集合种方式
    1 迭代器Iterator方式
    2 增强for循环方式
    3 果标标方式

    1122 遍历数组
    public static void main(String[] args) {
    遍历数组:
    String[] arr new String[] { xx yy zz }

    1增强for循环
    for (String elt arr) {
    Systemoutprintln(elt)
    }

    2标方式
    for (int i 0 i < arrlength i++) {
    Systemoutprintln(arr[i])
    }
    }


    1123 遍历List
    public static void main(String[] args) {
    遍历List:
    List list new ArrayList()
    listadd(aa)
    listadd(bb)
    listadd(cc)

    1增强for循环
    for (String elt list) {
    Systemoutprintln(elt)
    }

    2标
    for (int i 0 i < listsize() i++) {
    Systemoutprintln(listget(i))
    }

    3迭代器
    for (Iterator iter listiterator() iterhasNext()) {
    String elt iternext()
    Systemoutprintln(elt)
    }

    }


    1124 遍历Set
    public static void main(String[] args) {
    遍历Set:
    Set set new HashSet()
    setadd(dd)
    setadd(ee)
    setadd(ff)

    1增强for循环
    for (String elt set) {
    Systemoutprintln(elt)
    }

    2迭代器
    for(Iterator iter setiterator() iterhasNext() ){
    String elt iternext()
    Systemoutprintln(elt)
    }
    }


    1125 遍历Map
    public static void main(String[] args) {
    遍历Map:
    Map map new HashMap()
    mapput(aa xx)
    mapput(bb yy)
    mapput(cc zz)

    1增强for循环(Entry集合)
    for (Entry entry mapentrySet()) {
    Systemoutprintln(entry)
    }

    2增强for循环(Key集合)
    for(String key mapkeySet()){

    Systemoutprintln(key + + mapget(key))
    }

    3遍历值集合
    for(String value mapvalues()){
    Systemoutprintln(value)
    }
    }
    2

    12 泛型(Generic)
    集合中存储象类型时会导致程序运行时候转型异常
    import javautilArrayList
    import javautilIterator

    public class Demo5 {
    public static void main(String[] args) {
    ArrayList arr new ArrayList()
    arradd(new Tiger(华南虎))
    arradd(new Tiger(东北虎))
    arradd(new Sheep(喜羊羊))
    Systemoutprintln(arr)
    Iterator it arriterator()
    while (ithasNext()) {
    Object next itnext()
    Tiger t (Tiger) next
    teat()
    }

    }
    }
    class Tiger {
    String name

    public Tiger() {

    }

    public Tiger(String name) {
    thisname name
    }


    @Override
    public String toString() {

    return Tiger@name + thisname
    }

    public void eat() {
    Systemoutprintln(thisname + 吃羊)
    }
    }

    class Sheep {
    String name

    public Sheep() {

    }

    public Sheep(String name) {
    thisname name
    }

    @Override
    public String toString() {
    return Sheep@name + thisname
    }

    public void eat() {
    Systemoutprintln(thisname + 吃青草)
    }
    }

    原 发现然集合存储意象果需象特方法需类型转换果集合中存入象引发类型转换异常
    [Tiger@name华南虎 Tiger@name东北虎 Sheep@name喜羊羊]
    华南虎吃羊
    东北虎吃羊
    Exception in thread main javalangClassCastException cnitcastgzmapSheep cannot be cast to cnitcastgzmapTiger
    at cnitcastgzmapDemo5main(Demo5java17)
    出现问题
    存入特定象取出时候Object象需强制类型转换诱发类型转换异常
    法控制存入什类型象取出象时候进行强转时诱发异常编译时期法发现问题

    然类型转换时候通if语句进行类型检查(instanceof)效率较低(例吃饭时候需判断米饭里没沙子吃饭效率低)通容器加限定形式规定容器存储种类型象
    容器贴标签说明该容器中存储什样类型象
    jdk50出现泛型
    泛型应
    格式
    1 集合类<类类型> 变量名 new 集合类<类类型>()

    public class Demo5 {
    public static void main(String[] args) {
    泛型规定该集合放羊老虎进
    ArrayList arr new ArrayList()
    arradd(new Sheep(美羊羊))
    arradd(new Sheep(懒洋洋))
    arradd(new Sheep(喜羊羊))
    编译失败
    arradd(new Tiger(东北虎))
    Systemoutprintln(arr)
    Iterator it arriterator()
    while (ithasNext()) {
    泛型需强制类型转换
    Sheep next itnext()
    nexteat()
    }

    }
    }

    1 运行时异常提前编译时发生
    2 获取元素时候需强转类型避免类型转换异常问题

    格式 通<> 指定容器中元素类型
    什时候泛型类中操作引数类型确定时候泛型类
    JDK50前Comparable
    package javalang
    public interface Comparable {

    public int compareTo(Object o)
    }

    JDK50Comparable
    package javalang
    public interface Comparable {

    public int compareTo(T o)
    }

    表示泛型类型传入具体类型换

    细节
    声明泛型类型集合中存放特定类型元素
    public class Demo6 {
    public static void main(String[] args) {
    创建存储字符串list
    ArrayList arrnew ArrayList()
    arradd(gz)
    arradd(itcast)
    存储非字符串编译报错
    arradd(1)
    }
    }
    细节二
    泛型类型必须引类型
    public class Demo6 {
    public static void main(String[] args) {
    泛型类型必须引类型说集合存储基数类型
    ArrayList arr2new ArrayList()

    基数类型包装类
    ArrayList arr2 new ArrayList()


    }
    }


    细节三 泛型取出元素需类型转换
    public class Demo6 {
    public static void main(String[] args) {

    ArrayList arr new ArrayList()
    arradd(gzitcast)
    arradd(cditcast)
    arradd(bjitcast)
    泛型取出元素需类型转换

    String strarrget(0)
    Systemoutprintln()
    }
    }



    121 泛型方法
    需求:写函数调者传递什类型变量该函数返回什类型变量?
    实现
    法确定具体传递什类型数方法形参定义Object类型返回值Object类型该函数时需强制类型转换
    private Object getDate(Object obj) {
    return obj
    }

    进行强制类型转换否写出该功

    目前学知识法解决该问题
    需泛型类解决
    泛型定义解决问题
    泛型: 类型作变量处理规范泛型定义般写意字母

    1 函数泛型定义

    函数中明确数类型函数进行泛型定义

    public <泛型声明> 返回值类型 函数名( 泛型 变量名 ){


    }





    public static void main(String[] args) {
    int[] arr { 1 2 3 4 5 }

    new Demo6()getData(5)


    }

    public T getData(T data) {
    return data
    }

    细节:
    泛型方法前需进行泛型声明尖括号 <泛型>声明位置static返回值类型前
    类中函数声明泛型该泛型声明声明类
    122 泛型类
    格式
    2 类泛型声明

    修饰符 class 类名<泛型>{

    }


    import javautilArrays

    public class Demo6 {
    public static void main(String[] args) {
    泛型类创建象时候需指定具体类型
    new Demo6()getData(5)
    }

    public T getData(T data) {
    return data
    }

    反序意类型数组
    public void reverse(T[] arr) {
    int start 0
    int end arrlength 1
    for (int i 0 i < arrlength i++) {
    if (start < end) {
    T temp arr[start]
    arr[start] arr[end]
    arr[end] temp
    }

    }

    }


    泛型类中定义静态方法
    public class Demo6 {
    public static void main(String[] args) {
    Systemoutprintln(getData2(100))
    }

    public T getData(T data) {
    return data
    }

    静态方法
    public static T getData2(T data) {
    return data
    }

    }

    注意:静态方法类中定义泛型
    类中泛型需象初始化时指定具体类型静态优先象存类中静态方法需单独进行泛型声明声明泛型定写static返回值类型前
    泛型类细节:
    1创建象时候指定泛型具体类型
    2创建象时指定泛型具体类型(创建集合象眼)默认Object例集合存储元素时候没泛型参数类型Object
    3类面声明泛型应非静态成员函数果静态函数需泛型
    需函数独立声明
    4果建立象指定泛型具体类型该象操作方法时方法操作种数类型
    5类泛型声明时该类方法中声明泛型

    泛型练:
    定义泛型成员
    public class Demo7 {

    public static void main(String[] args) {
    Father f new Father(jack)
    Systemoutprintln(fgetT())
    Father f2 new Father(20)
    Systemoutprintln(f2getT())
    }

    }

    class Father {
    private T t

    public Father() {

    }

    public Father(T t) {
    super()
    thist t
    }

    public T getT() {
    return t
    }

    public void setT(T t) {
    thist t
    }

    }

    果Father类子类子类该实现
    public class Demo7 {
    public static void main(String[] args) {
    Father f new Father(jack)
    Systemoutprintln(fgetT())
    Father f2 new Father(20)
    Systemoutprintln(f2getT())
    }

    }

    class Father {
    private T t


    public Father() {

    }

    public Father(T t) {
    super()
    thist t
    }

    public T getT() {
    return t
    }

    public void setT(T t) {
    thist t
    }

    }
    子类指定具体类型
    class Son extends Father{

    }
    子类需泛型
    class Son3 extends Father{

    }
    错误写法父类定义泛型需进行处理
    class Son2 extends Father{

    }

    123 泛型接口
    public class Demo8 {
    public static void main(String[] args) {
    MyInter my new MyInter()
    myprint(泛型)

    MyInter2 my2 new MyInter2()
    myprint(传字符串)
    }

    }

    interface Inter {
    void print(T t)
    }

    实现知类型时样定义
    class MyInter implements Inter {
    public void print(T t) {
    Systemoutprintln(myprint + t)
    }
    }
    接口时明确具体类型
    class MyInter2 implements Inter {

    @Override
    public void print(String t) {
    Systemoutprintln(myprint + t)

    }

    }



    13 IO流
    131 IO流分类

    输入流
    输出流
    说明
    字节流
    InputStream
    OutputStream
    字节流处理字节(二进制)
    字符流
    Reader
    Writer
    字符流处理字符

    注:类抽象类

    132 读文件代码
    public static void main(String[] args) {
    String path catxt

    FileInputStream in null
    try {
    开流
    in new FileInputStream(path)
    流读文件容
    int b inread()
    while (b 1) {
    Systemoutprint((char) b)
    b inread()
    }
    } catch (Exception e) {
    throw new RuntimeException(e)
    } finally {
    释放资源
    if (in null) {
    try {
    inclose()
    } catch (IOException e) {
    throw new RuntimeException(e)
    }
    }
    }
    }


    133 拷贝文件代码
    public static void main(String[] args) {
    String srcPath catxt
    String destPath cbtxt

    定字节流
    InputStream in null
    OutputStream out null
    try {
    开流
    in new FileInputStream(srcPath)
    out new FileOutputStream(destPath)

    byte[] buf new byte[1024 * 8]
    for (int len 1 (len inread(buf)) 1) {
    outwrite(buf 0 len)

    }
    } catch (Exception e) {
    eprintStackTrace()
    } finally {
    释放资源
    try {
    if (in null) {
    inclose()
    }
    } catch (IOException e) {
    throw new RuntimeException(e)
    } finally {
    if (out null) {
    try {
    outclose()
    } catch (IOException e) {
    throw new RuntimeException(e)
    }
    }
    }
    }
    }


    14 线程
    141 启动线程方式
    1 定义类继承Thread类
    代码new MyThread()start()
    2定义类实现Runnable接口
    代码new Thread(new MyRunnable())start


    142 代码
    代码分两种方式启动线程(匿名部类)
    private static int count 100

    public static void main(String[] args) {

    继承Thread类方式启动线程
    new Thread() {
    public void run() {
    synchronized (StartThreadTestclass) {
    while (count > 0) {
    count
    Systemoutprintln(ThreadcurrentThread() + 卖张票剩 + count)
    }
    }
    }
    }start()

    实现Runnable接口方式启动线程
    new Thread(new Runnable() {
    public void run() {
    synchronized (StartThreadTestclass) {
    while (count > 0) {
    count
    Systemoutprintln(ThreadcurrentThread() + 卖张票剩 + count)
    }
    }
    }
    })start()
    }


    二 Junit单元测试
    21 Junit单元测试框架基

    搭建环境:
    导入junitjar包(junit4)

    二写测试类:
    0般类应测试类
    1测试类测试类放包中(源文件夹)
    2测试类名字测试类名字加Test缀

    三:写测试方法:
    0般方法应单元测试方法
    1测试方法名字test前缀加测试方法名字testAddPerson()
    2单元测试方法面加@Test注解(orgjunitTest)
    3单元测试方法参数返回值(返回void)测试方法静态方法

    四测试方法基:
    1单独执行测试方法次执行包类中测试方法
    2执行完显示绿色表示测试成功显示红色表示测试失败(抛异常会测试失败)

    22 Assert断言工具类

    中静态工具方法(符合期抛异常):

    assertTrue() 参数值应true
    assertFalse() 参数值应false

    assertNull() 应null值
    assertNotNull() 应非null值

    assertSame() 较结果true(表示象)
    AssertNotSame() 较结果false

    assertEquals() 两象equals()方法较结果true

    23 准备环境清理环境方法
    @Test
    表示单元测试方法

    @Before
    修饰方法应非static(没参数返回值void)
    表示方法会类中单元测试方法前执行次

    @After
    修饰方法应非static(没参数返回值void)
    表示方法会类中单元测试方法执行次


    @BeforeClass
    修饰方法应static(没参数返回值void)
    表示方法会类中单元测试方法前执行执行次

    @AfterClass
    修饰方法应static(没参数返回值void)
    表示方法会类中单元测试方法执行执行次


    三 省(Introspector)
    什学省?
    开发框架时常需java象属性封装程序数次反射技术完成类操作麻烦sun公司开发套API专门操作java象属性

    省操作java象属性问题必须清楚

    问题: 什Java象属性属性读写方法?

    问题二 通省访问javaBean属性

    1 通PropertyDescriptor类操作Bean属性

    public static void testPropertyDescriptor() throws Exception{
    Person p new Person()
    PropertyDescriptor propertyDescriptor new PropertyDescriptor(idPersonclass)
    获取属性写方法
    Method writeMethod propertyDescriptorgetWriteMethod()
    Method readMethod propertyDescriptorgetReadMethod()
    propertyDescriptorgetReadMethod()
    writeMethodinvoke(p 12)
    Systemoutprintln(readMethodinvoke(p null))
    }


    2 通Introspector类获Bean象 BeanInfo然通 BeanInfo 获取属性描述
    器( PropertyDescriptor )通属性描述器获取某属性应 gettersetter 方法然通反射机制调方法

    public static void testIntrospector() throws Exception{
    BeanInfo beanInfo IntrospectorgetBeanInfo(Personclass)
    PropertyDescriptor[] descriptor beanInfogetPropertyDescriptors()
    for(PropertyDescriptor itemProperty descriptor){
    Systemoutprintln(itemPropertygetReadMethod()getName())
    }
    }

    存问题: sun公司省API繁琐Apache组织结合实际开发中应场景开发套简单易API操作Bean属性——BeanUtils

    public static void main(String[] args) throws Exception {
    Person p new Person()
    ConvertUtilsregister(new Converter() {

    @Override
    public Object convert(Class type Object value) {
    try {
    if(valuenull){

    SimpleDateFormat dateFormat new SimpleDateFormat(yyyy MM dd)
    Date d dateFormatparse((String) value)
    return d
    }
    } catch (ParseException e) {
    TODO Autogenerated catch block
    eprintStackTrace()
    }

    return null
    }
    } Dateclass)

    BeanUtilssetProperty(pid110)
    BeanUtilssetProperty(pname狗娃)
    BeanUtilssetProperty(p birthDay1992 12 12)
    Systemoutprintln(pgetId() ++ pgetName()++pgetBirthDay())
    }

    四 Properties类配置文件
    41 Properties配置文件说明
    Properties类应properties文件文件容键值键值间空格隔开开头#表示注释

    Properties类加载properties文件时iso88591编码文件中中文特殊处理:果配置文件中中文必须进行转义native2asciiexe命令操作
    native2ascii dmyproperties dmy2properties

    Properties类中load(InputStream) 方法加载配置文件中store(OutputStream) 方法保存配置指定文件

    更信息Properties类API文档

    42 加载配置文件
    public static void testLoadProperties() throws Exception {
    Properties properties new Properties()

    InputStream in new FileInputStream(Eitcastconfigproperties)
    propertiesload(in) 加载
    inclose()

    Systemoutprintln(properties)
    }

    43 写配置文件
    public static void testStoreProperties() throws Exception {
    准备配置信息
    Properties properties new Properties()
    propertiessetProperty(name 李四)
    propertiessetProperty(age 20)

    准备
    OutputStream out new FileOutputStream(dmyproperties)
    String comments 配置文件

    写出
    propertiesstore(out comments)
    outclose()
    }


    作业:properties读取配置文件读取数库户名密码包成jar包
    44 Properties类
    public class DBUtil {

    static Properties properties new Properties()

    static{
    try {
    Class clazz DBUtilclass
    InputStreamReader fileReader
    new InputStreamReader(clazzgetResourceAsStream(dbproperties))
    propertiesload(fileReader)
    } catch (IOException e) {
    eprintStackTrace()
    }
    }
    public static String getUserName(){
    String userName propertiesgetProperty(userName)
    return userName
    }

    public static String getPassword(){
    return propertiesgetProperty(password)
    }
    public static void main(String[] args) {
    Systemoutprintln(户名:+ getUserName())
    Systemoutprintln(密码 + getPassword())
    }
    }
    五 文件路径
    51 绝路径
    根目录某盘符开头路径(者说完整路径)
    例:
    l catxt (Windows操作系统中)
    l cxxxatxt (Windows操作系统中)
    l varxxaatxt (Linux操作系统中)

    绝路径问题 C\abc\aproperties文件路径该路径windows执行没 问题果该项目移动linux面执行 该路径会出现问题linux面没c盘根目录\

    52 相路径
    相前路径路径例前文件夹cabc时:相路径atxt表示cabcatxt相路径xxatxt cabcxxatxt

    l 表示前文件夹
    l 表示级文件夹

    相路径存问题相路径相目前执行class文件时候控制台路径样子会导致出现问题

    53 Java程序中相路径
    Java程序中File时写相路径指相执行java命令时前文件夹

    测试代码:
    public class PathTest {
    public static void main(String[] args) throws Exception {
    Systemoutprintln(new File(atxt)getAbsolutePath())
    }
    }

    命令行中cd命令切换路径试试说效果

    Eclipse中前路径工程根目录
    54 classpath路径
    541 classpath路径说明
    Java程序中般情况绝路径相路径太合适Java程序jar包放位置确定执行java程序时前路径确定合适般Java程序中会资源放classpath中然classpath路径查找资源

    Classpath路径:classpath目前路径
    542 获取classpath中资源(InputStream)
    public static void main(String[] args) throws Exception {
    Class clazz new ClassPathTest()getClass()

    开头''表示classpath根目录表示classpath根目录中开始查找资源
    InputStream in clazzgetResourceAsStream(cnitcastmyproperties)

    果开头没''表示前class包中开始查找
    InputStream in2 clazzgetResourceAsStream(myproperties)
    }


    六基础增强
    61课程回顾
    XML技术
    ServletJsp
    数库
    Jdbc技术
    JavaWeb增强
    滤器监听器文件传载国际化

    学组件:
    Dom4JXpathDBUtilsC3p0BeanUtilslog4J…
    Struts Spring Hibernate


    目标:
    1 泛型
    2 注解
    3 log4J 日志 (项目中)
    4 枚举



    62 泛型
    掌握知识:
    基法泛型擦泛型类泛型方法泛型接口泛型关键字反射泛型(案例)

    621 概述
    泛型JDK15 编译时期进行类型检查避免频繁类型转化

    运行时期异常
    @Test
    public void testGeneric() throws Exception {
    集合声明
    List list new ArrayList()
    listadd(China)
    listadd(1)

    集合
    String str (String) listget(1)

    }

    泛型
    @Test
    public void testGeneric2() throws Exception {
    声明泛型集合时候指定元素类型
    List list new ArrayList()
    listadd(China)
    listadd(1) 编译时期报错

    String str listget(1)
    }


    泛型擦
    泛型编译时期效编译字节码文件中存泛型信息

    *
    * 泛型擦实例

    public void save(List p){
    }

    public void save(List d){ 报错: 面方法编译样
    }
    *


    泛型写法
    泛型写法
    @Test
    public void testGeneric3() throws Exception {
    声明泛型集合集合两端类型必须致
    List list new ArrayList()
    List list1 new ArrayList()
    List list2 new ArrayList()
    List list3 new ArrayList()

    错误
    List list4 new ArrayList()
    错误: 泛型类型必须引类型基类型
    List list5 new ArrayList()
    }


    622 泛型方法泛型类泛型接口
    作:
    设计公类方法公业务实现进行抽取
    程序更灵活

    1 泛型方法
    public class GenericDemo {

    定义泛型方法
    public T save(T tK k) {
    return null
    }

    测试方法
    @Test
    public void testMethod() throws Exception {
    泛型方法 泛型方法时候确定泛型类型
    save(10f 1)

    }
    }


    2 泛型类:
    public class GenericDemo {

    定义泛型方法
    public T save(T tK k) {
    return null
    }

    public void update(T t) {

    }

    测试方法
    @Test
    public void testMethod() throws Exception {

    泛型类: 创建爱泛型类象时候确定类型
    GenericDemo demo new GenericDemo()
    demosave(test 1)
    }
    }

    3 泛型接口:
    **
    * 泛型接口
    * @author JieYuan
    *
    * @param
    *
    public interface IBaseDao {
    void save(T t )
    void update(T t )
    }


    泛型接口类型确定: 实现泛型接口类抽象类型具体实现中确定创建泛型类时候确定
    public class BaseDao implements IBaseDao {

    泛型接口类型确定: 业务实现类中直接确定接口类型
    public class PersonDao implements IBaseDao{





    623 泛型关键字
    泛型中:
    指定接收值
    extends 元素类型必须继承指定类
    super 元素类型必须指定类父类


    关键字 :

    **
    * 泛型 涉关键字
    *
    * Ctrl + shift + R 查前项目中类
    * Ctrl + shift + T 查源码jar包中类
    * @author JieYuan
    *
    *
    public class App_extends_super {

    带泛型特征方法
    public void save(List<> list) {
    获取迭代list 编辑list
    }

    @Test
    public void testGeneric() throws Exception {

    接收泛型集合 编辑集合值 般方法参数中
    List<> list new ArrayList()
    listadd() 报错
    }
    }


    关键字 : extends 限

    public class App_extends_super {



    **
    * list集合处理 DoubleFloatInteger等类型
    * 限定元素范围:元素类型继承Number类 (限)
    * @param list
    *
    public void save(List< extends Number> list) {
    }

    @Test
    public void testGeneric() throws Exception {
    List list_1 new ArrayList()
    List list_2 new ArrayList()
    List list_3 new ArrayList()

    List list_4 new ArrayList()


    save(list_1)
    save(list_2)
    save(list_3)
    save(list_4)
    }
    }




    关键字 : super 限


    **
    * 泛型 涉关键字
    *
    * Ctrl + shift + R 查前项目中类
    * Ctrl + shift + T 查源码jar包中类
    * @author JieYuan
    *
    *
    public class App_super {


    **

    * super限定元素范围:必须String父类 限
    * @param list
    *
    public void save(List< super String> list) {
    }

    @Test
    public void testGeneric() throws Exception {
    调面方法必须传入String父类
    List list1 new ArrayList()
    List list2 new ArrayList()

    List list3 new ArrayList()
    save(list3)
    }
    }
    624 泛型反射
    案例设置通方法会反射泛型

    步骤:
    1 案例分析 实现
    2 涉知识点(jdk api)
    3 优化 反射泛型


    反射泛型涉API:
    Student 类型表示
    Id name
    ParameterizedType 参数化类型表示
    ArrayList()

    Type 接口类型默认接口
    包括: 引类型原始类型参数化类型

    List list new ArrayList()
    泛型集合: list
    集合元素定义:new ArrayList() 中String
    参数化类型: ParameterizedType
    :ArrayList 参数化类型



    反射泛型案例
    public class AdminDao extends BaseDao {}
    public class AccountDao extends BaseDao {}


    **
    * dao公方法里实现
    * @author JieYuan
    *
    *
    public class BaseDao{

    保存前运行类参数化类型中实际类型
    private Class clazz
    表名
    private String tableName



    构造函数: 1 获取前运行类参数化类型 2 获取参数化类型中实际类型定义(class)
    public BaseDao(){
    this 表示前运行类 (AccountDaoAdminDao)
    thisgetClass() 前运行类字节码(AccountDaoclassAdminDaoclass)
    thisgetClass()getGenericSuperclass() 前运行类父类BaseDao
    实参数化类型 ParameterizedType
    Type type thisgetClass()getGenericSuperclass()
    强制转换参数化类型 BaseDao
    ParameterizedType pt (ParameterizedType) type
    获取参数化类型中实际类型定义 new Type[]{Accountclass}
    Type types[] ptgetActualTypeArguments()
    获取数第元素:Accoutclass
    clazz (Class) types[0]
    表名 (类名样获取类名)
    tableName clazzgetSimpleName()
    }


    **
    * 键查询
    * @param id 键值
    * @return 返回封装象
    *

    public T findById(int id){
    *
    * 1 知道封装象类型
    * 2 表名表名象名称样 键id
    *
    *
    * 前运行类继承父类 BaseDao
    * Accountclass
    *

    String sql select * from + tableName + where id
    try {
    return JdbcUtilsgetQuerrRunner()query(sql new BeanHandler(clazz) id)
    } catch (SQLException e) {
    throw new RuntimeException(e)
    }
    }


    **
    * 查询全部
    * @return
    *
    public List getAll(){
    String sql select * from + tableName
    try {
    return JdbcUtilsgetQuerrRunner()query(sql new BeanListHandler(clazz))
    } catch (SQLException e) {
    throw new RuntimeException(e)
    }
    }
    }



    63 反射复
    反射运行时期动态创建象获取象属性方法

    public class Admin {


    Field
    private int id 1000
    private String name 匿名

    Constructor
    public Admin(){
    Systemoutprintln(AdminAdmin())
    }
    public Admin(String name){
    Systemoutprintln(AdminAdmin() + name)
    }

    Method
    public int getId() {
    return id
    }
    public void setId(int id) {
    thisid id
    }
    public String getName() {
    return name
    }
    public void setName(String name) {
    thisname name
    }

    }


    反射技术
    public class App {

    1 创建象
    @Test
    public void testInfo() throws Exception {
    类全名
    String className cnitcastc_reflectAdmin
    类字节码
    Class<> clazz ClassforName(className)

    创建象1 默认构造函数简写
    Admin admin (Admin) clazznewInstance()


    创建象2: 通带参数构造器创建象
    Constructor<> constructor clazzgetDeclaredConstructor(Stringclass)
    Admin admin (Admin) constructornewInstance(Jack)

    }
    @Test
    2 获取属性名称值
    public void testField() throws Exception {

    类全名
    String className cnitcastc_reflectAdmin
    类字节码
    Class<> clazz ClassforName(className)

    Admin admin (Admin) clazznewInstance()

    获取属性名称
    Field[] fs clazzgetDeclaredFields()
    遍历:输出属性名称值
    for (Field f fs) {
    设置强制访问
    fsetAccessible(true)
    名称
    String name fgetName()

    Object value fget(admin)

    Systemoutprintln(name + value)
    }
    }

    @Test
    3 反射获取方法
    public void testMethod() throws Exception {

    类全名
    String className cnitcastc_reflectAdmin
    类字节码
    Class<> clazz ClassforName(className)

    Admin admin (Admin) clazznewInstance()

    获取方法象 public int getId() {

    Method m clazzgetDeclaredMethod(getId)
    调方法
    Object r_value minvoke(admin)

    Systemoutprintln(r_value)
    }

    }


    64 注解
    641 概述
    注解注释
    注解告诉编译器运行程序
    注释 程序员阅读编译运行没影响

    注解作
    1 告诉编译器运行程序
    2 简化(取代)配置文件 案例

    常注解
    重写父类方法
    @Override
    public String toString() {
    return supertoString()
    }

    抑制编译器警告
    @SuppressWarnings({unusedunchecked})
    private void save() {
    List list null
    }

    标记方法时
    @Deprecated
    private void save1() {
    }

    642 定义注解
    通定义注解类字段方法添加描述信息

    a 注解基写法
    **
    * 定义注解 (描述作者)
    * @author JieYuan
    *
    *
    public @interface Author {

    **
    * 注解属性
    * 1 修饰默认public
    * 2 体
    *
    String name()
    int age()
    }


    @Author(name Jet age 30)
    public void save() {

    }

    b带默认值注解
    public @interface Author {

    **
    * 注解属性

    * 1 修饰默认public
    * 2 体
    *
    String name()
    int age() default 30 带默认值注解 时候写属性值
    }


    b默认名称注解
    注解属性名称value默认名称
    public @interface Author {
    果注解名称value时候省略名称直接值
    (注解属性时候省略名称)
    String value()
    }


    @Author(Jet)
    @Author(value Jet)




    注解属性类型数组:
    public @interface Author {

    String[] value() default {test1test2}
    }

    @Author({})
    public void save() {


    }


    643 元注解
    元注解表示注解注解

    指定注解范围:
    @Target({
    TYPE 类
    FIELD 字段
    METHOD 方法
    PARAMETER 参数
    CONSTRUCTOR 构造器
    LOCAL_VARIABLE 局部变量
    })

    元注解 2 指定注解声明周期
    @Retention(RetentionPolicySOURCE) 注解源码级效
    @Retention(RetentionPolicyCLASS) 注解字节码效 默认值
    @Retention(RetentionPolicyRUNTIME) 注解运行时期效

    645 注解反射
    @Id
    @Author(remark 保存信息 age 19)
    public void save() throws Exception {
    获取注解信息: nameageremark


    1 先获取代表方法Method类型
    Class clazz App_2class
    Method m clazzgetMethod(save)

    2 获取方法注解
    Author author mgetAnnotation(Authorclass)
    获取输出注解信息
    Systemoutprintln(authorauthorName())
    Systemoutprintln(authorage())
    Systemoutprintln(authorremark())

    }






    65 注解优化BaseDao代码
    表名数库名称致 字段属性样键id 面BaseDao

    通配置文件(XML) 解决


    注解:
    简化XML配置 程序处理非常方便
    (便维护: 例修改字段名重新编译)

    XML
    便维护 需读取代码


    66 Log4J日志组件
    程序中什日志组件?
    简单说项目期部署线维护错误排查

    Log4j log for java 开源日志组件

    步骤:
    1 载组件引入jar文件
    log4j1211jar
    2 配置 srclog4jproperties
    3

    # 通根元素指定日志输出级目:
    # 日志输出优先级: debug < info < warn < error
    log4jrootLoggerinfoconsolefile


    ############# 日志输出控制台 #############
    # 日志输出控制台api类
    log4jappenderconsoleorgapachelog4jConsoleAppender
    # 指定日志输出格式: 灵活格式
    log4jappenderconsolelayoutorgapachelog4jPatternLayout
    # 具体格式容
    log4jappenderconsolelayoutConversionPatternd p cM()mn


    ############# 日志输出文件 #############
    log4jappenderfileorgapachelog4jRollingFileAppender
    # 文件参数: 指定日志文件路径
    log4jappenderfileFilelogsMyLoglog
    # 文件参数: 指定日志文件
    log4jappenderfileMaxFileSize5kb
    # 文件参数: 指定产生日志文件数目
    log4jappenderfileMaxBackupIndex100
    # 日志格式
    log4jappenderfilelayoutorgapachelog4jPatternLayout
    log4jappenderfilelayoutConversionPatternd cM()mn


    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 4 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    Java基础练习题附答案

    Java基础练习题 附答案一、简单Java程序调试1)以下哪个是Java应用程序main方法的有效定义?A. public static void main();B. public stati...

    2年前   
    358    0

    java教案

    设计摘要专业 物联网 课程 Java程序设计课时 1 课型 理论+实践班级 18级物联网教材 零基础学Java-明日科技出版章节 面向对象核心技术

    4年前   
    824    0

    《Java语言程序设计-基础篇》答案-第03章

    《Java语言程序设计-基础篇》答案-第03章第3章 控制语句复习题3.1 答:if(i % 2 == 0)System.out.println(“偶数”);elseSystem.out.pr...

    3年前   
    853    0

    java毕业论文java程序设计

    XXXX学院XXXX毕业论文Java程序设计专业 计算机网路技术 学号XXXX 姓名 XXX 指导教师姓名 XXX 职称 单位 XXX 完成毕业设计(论文)的实践基地 XXX...

    7个月前   
    562    0

    java 50题

    【程序1】    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔**到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    //这是一个菲...

    9年前   
    7727    0

    java求职信

    java求职信第一篇:java程序员求职信模板尊敬的领导:您好!十分感谢您在百忙之中能翻阅我的自荐信。与公司是一种选择,与我则是一种机会。在上千份大同小异的求职信中,我期望你手中的这份能给您带...

    11年前   
    476    0

    JAVA学习计划

    Java学习计划 好的计划是成功的一半,今天是在创新思维的第一节课,在这门课程的开始,一个有策略的、有目的性的计划是非常必要的,为了在以后的学习中能够达到最好的效果,“坚持”是一把雕刻刀,不...

    10年前   
    9153    0

    java实习报告心得

    java实习报告心得  作为就业培训,项目的好坏对培训质量的影响十分大,常常是决定性的作用。这篇文章是关于在学习java软件开发时练习项目的总结,简单总结为以下几点:   作为就业培训,项目的...

    9年前   
    541    0

    《Java趣味编程100例》

    第1章 变幻多姿的图表图表简洁直观,在各种场合得到广泛应用,给人以很强的视觉冲击,经常让人难以忘怀。我们的程序中如果能够灵活地应用图表,一定能给我们的程序增色不少。本章将带你进入变换多姿的图...

    2年前   
    824    0

    2018年java实习心得

    java实习心得  这一期的实习,虽然实习的时间不长,但是总体上收获挺大的,学习中我不但有了学习成果的喜悦,而且自己也日渐成熟,有种说不出的喜悦。以下是我在这次实习中的一些感悟和体会:  1....

    6年前   
    402    0

    java学习笔记

    java学习笔记  jdk(java development kit)  有如下公司或组织开发jdk  sun jdk  ibm jdk  bea jrocket  gun jdk  其中ib...

    10年前   
    577    0

    JAVA终端测试规范

     中国移动通信企业标准 QB-╳╳-╳╳╳-╳╳╳╳ JAVA终端测试规范V1.0 Testing Specification for JAVA...

    9年前   
    7592    0

    java实训报告总结

    java实训报告总结  作为就业培训,项目的好坏对培训质量的影响十分大,常常是决定性的作用。这篇文章是关于在学习java软件开发时练习项目的总结,简单总结为以下几点:   作为就业培训,项目的...

    10年前   
    591    0

    java学习心得笔记

    java学习心得笔记  j2ee学习笔记   注:框架可以用word菜单中的 “视图/文档结构图” 看到   j2ee模式   value object(值对象) 用于把数据从某个对象/层传递...

    9年前   
    501    0

    迷你DVD管理器java

    实 验 报 告课程名称:面向对象信息系统开发实 验:期中大作业班 级:02学生姓名:李康序 号:34学 号:20181060261 ...

    4年前   
    633    0

    java面试资料整理

    第 1 页 共 57 页 面试题集 面试题集共分为以下十局部: 一、Core Java: 1 — 95题 1 — 24页 根底及语法: 1 — 61题 1 — 13页 异常: 62 — 69题...

    1个月前   
    278    0

    java 面试题大全

    企业笔试面试题分析本套题目主要出自神州数码, 华为, 笔试考试题以及SCJP认证考题一, 选择题1. 以下数组初始化正确的选项是:CA int[5] a= {1,2,3,4,5};B int[...

    1个月前   
    391    0

    基于java的学生信息管理系统

    科技带动计算机行业不断地发展,计算机行业的发展也给每个行业带来了巨大的收益,使其工作效率得到提高,同时方便了人们的生活。本系统使用SSM框架,主要采用自顶向下的相关研究的方法。

    3年前   
    794    0

    基于JAVA的医院门诊预约

    社会医疗工作和公民的日子息息相关,跟着公民日子水平的前进以及科学技能的前进,人们对医疗条件医疗效劳质量提出了更高的要求。医疗检查是病人获得国家保健服务的第一步,由于旅客交通量迅速增加,传统医院门...

    3年前   
    655    0

    员工信息管理系统java

    云南大学2019年春季学期信息学院电子信息工程2018级《面向对象信息系统开发》期末检测(堂下测试)试卷A满分100分 考试时间:150分钟 任课教师:高莲学院:__信息学...

    4年前   
    848    0