`
zhongsw
  • 浏览: 24285 次
文章分类
社区版块
存档分类
最新评论

黑马程序员_JDK1.5新特性和反射机制

阅读更多
 

---------------------- android培训java培训 、期待与您交流! ----------------------

 

 

 

 

 

 

JDK1.5 新特性 :

静态导入 .

普通的 import 语句可以导入一个类或者某个包中所有的类 .

import static 语句导入

静态导入方法      import static java.lang.Math.*;

 

可变参数 : 一个方法接受的参数个数不固定 .

可变的特点 :

1.       只能出现在参数列表的最后

2.       位于变量类型和变量名之间 , 前后有无空格都可以

3.       调用可变参数和方法时 , 编译器为该可变参数隐含创建一个数组 , 在方法体中以数组的形式访问可变参数 .

 

增强 for 循环

语法 :for(type 变量名 : 集合变量名 ){…}   

注意 :

迭代变量必须在 () 中定义      集合变量可以是数组或实现了 iterable 接口的集合类

 

自动装箱拆箱

Integer iObj=3; 自动把基本数据类型装成一个 Integer 对象在赋给引用变量

syso(iObj+12); 自动拆箱

引入享元数据模式 :flyweight

当对象很小 , 很多个地方要用到这些小的对象 , 可以把这些对象的共性抽取出来封装成一个对象 , 把不同的地方当成方法的参数传递给该对象 . 不同的部分叫做外部状态 , 相同的部分叫做内部状态 .

 

枚举 :

定义的构造方法和其他信息都必须位于元素列表之后 .

枚举中的元素等效于静态的成员变量 . 在调用执行的时候会调用相应的构造方法 .

枚举元素必须位于开始部分 , 元素列表后面用 ; 号与其他元素分隔 ,

枚举相当于一个类 , 其中可以定义构造方法 , 成员变量 , 普通方法和抽象方法 .

带构造方法的枚举 :

1.       构造方法必须私有 ,

2.       如果有多个构造方法 , 看元素类型的参数来选择构造方法 ,MON MON()) 效果一样 , 都是调用默认的构造方法 .

 

带抽象方法的枚举 , 交通灯例子 .

枚举只有一个成员时 , 可以作为一种单例设计模式 . 因为构造方法已经私有化了 , 元素是自然的 new 出来 . 不用 getInstance.

 

public class TestEnum {
    /*最普通的枚举*/
    public enum ColorSelect {
        red, green, yellow, blue;    
    }

    /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */
    public enum Season {
        // 枚举列表必须写在最前面,否则编译出错
        winter, spring, summer, fall;

        private final static String location = "Phoenix";        

        public static Season getBest() {
            if (location.equals("Phoenix"))
                return winter;
            else
                return summer;
        }
    }
    /*还可以有构造方法*/
    public enum Temp {
        /*通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错
         * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
         * 如果不赋值则不能写构造器,赋值编译也出错*/
        absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);
        
        private final int value;
        public int getValue() {
            return value;
        }
        //构造器默认也只能是private, 从而保证构造函数只能在内部使用
        Temp(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) {
        /*
         * 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
         */
        ColorSelect m = ColorSelect.blue;
        switch (m) {
        /*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
          *所以为blue而非ColorSelect.blue
          */

   case red:
            System.out.println("color is red");
            break;
        case green:
            System.out.println("color is green");
            break;
        case yellow:
            System.out.println("color is yellow");
            break;
        case blue:
            System.out.println("color is blue");
            break;
        }
        System.out.println("遍历ColorSelect中的值");
        /*通过values()获得枚举值的数组*/
        for (ColorSelect c : ColorSelect.values()) {
            System.out.println(c);
        }  

   System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");

   /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
  System.out.println(ColorSelect.red.ordinal());//0
  System.out.println(ColorSelect.green.ordinal());//1
  System.out.println(ColorSelect.yellow.ordinal());//2
  System.out.println(ColorSelect.blue.ordinal());//3


  /*枚举默认实现了java.lang.Comparable接口*/ 
  System.out.println(ColorSelect.red.compareTo(ColorSelect.green));


  System.out.println(Season.getBest());
        
        for(Temp t:Temp.values()){
            /*通过getValue()取得相关枚举的值*/
            System.out.println(t+"的值是"+t.getValue());
        }

    }
}
 

 

反射的基石 Class .

Java 类是用于描述一类事物的共性 , 该类事物有什么属性 , 没有什么属性 , 至于这属性的值是什么 , 则是这个类的实例对象来确定的 .Java 程序中的各个 Java 类是同一类事物 , Class 来描述 .

如何得到各个字节码对应的实例对象 (Class 类型 )

1.       类名 .class

2.       对象 .getClass()

3.       Class.rotName(“ 类名 ”)

 

Class.isPrimitive() 是否是原始类型的字节码 .

int.class==Integer.TYPE              //true

TYPE 代表这个类型的基本类型的字节码 .

在源程序中出现的类型 , 都有各自的 Class 实例对象 . 例如 int[],void…

反射 : 就是把 Java 类中的各种成分映射成相应的 java .

为什么要用反射 ?

可以保持最大的灵活度,比如只要根据类名就可以实例化对象,就可以写到配置文件里面,获取这个字符串来实例化对象,如果需要换成别的类,只需要修改配置文件就行了,不然还需要修改源代码再重新编译等等 .

 

构造方法的反射 :

Constructor 类代表某个类的一个构造方法 .

得到某个类所有的构造方法

Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

得到某一个构造方法

Constructor constructor = Class.forName( java.lang.String ).getConstructor(StringBuffer.class);

调用获得的方法时要用到和获得方法相同类型的实例对象 .

创建实例对象 :

通常方式 : String str = new String(new StringBuffer("abc"));

反射方式 : String str = (String)constructor.newInstance(new StringBuffer("abc"));

Class.newInstance() 方法直接用来创建无参的构造方法的实例对象 .

String obj = (String)Class.forName("java.lang.String").newInstance();

 

成员变量的反射 :

Reflectpoint pt1= new ReflectPoint(3,5);

Field fieldY=new ReflectPoint(2,4).getClass.getField(“y”);//fieldY 不是对象身上的变量 , 而是类上的 , 要用它去取某个对象的值要明确他到哪个对象身上去取 .

fieldY.get(pt1);

对于不可见的私有的方法获取     private x;

fieldX.setAccessible(true);

pt1.getClass().getDeclaredField(“x”)

 

成员方法的反射 .

得到类中的某一个方法 :

  Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

调用方法 : 反射方式 : System.out.println(charAt.invoke(str, 1));

用反射得到字节码中的某个方法 , 在用这个方法去作用于某个对象 . 如果调用的第一个参数对象为 null, 代表该 method 对象对应的是一个静态方法 !

jdk1.4 jdk1.5 invoke 方法的区别:

      Jdk1.5 public Object invoke(Object obj,Object... args)

     Jdk1.4 public Object invoke(Object obj,Object[] args) ,即按 jdk1.4 的语法,需要将一个数组作为参数传递给 invoke 方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用 charAt 方法的代码也可以用 Jdk1.4 改写为 charAt.invoke( str , new Object[]{1}) 形式。

 

 

有相同和元素类型的数组属于同一个类型 , 有相同的 Class.

基本类型的一维数组可以当作 Object 类型使用 , 不能当作 Object[] 类型使用 ;

非基本类型的两种都可以用 .

 

Arrays.asList(); 方法在处理 int[] String[] 时的差异 .

String[] 1.4 的处理 .int[] 1.5 的把整个数组作为一个对象来处理 .

 

ArrayList_HashSet 的比较及 Hashcode 分析 .Hashcode 的作用 ?

Hashcode 作用 : 每一个用到 Hashset 集合的对象 , 在读取和存储的时候都要计算该对象的 Hashcode , 然后存储在 Hashcode 地址段中 . 在我们要操作一个新的对象时 . 我们要判断这个对象是否存在 , 这时计算该对象的 Hashcode , 然后到相应的地址段中去查找该对象是否存在 . 不用从头到尾每个对象查找对比 , 大大的提高了效率 , 两个对象的 equals 方法相等的话他们的 Hashcode 值肯定相同 , 反过来不一定成立了 . 而且当 Hashcode 的值确定以后 , 不要修改参与哈希值计算的数据的值 , 修改后会造成对这个集合操作时找不到原来相对应对象了 . 修改值会导致内存泄露 .

 

反射的作用 . 实现框架功能 .

框架与工具的区别 : 工具类是被用户类调用 , 而框架则是调用用户提供的类 .

框架要解决的核心问题 :

因为在写程序时无法知道要被调用的类名 , 所以在程序中无法直接 new 某个类的实例对象了 , 这就要用到反射的方式来做 . 程序中不要用具体的类的名字 , 而是从一个配置文件中读取 .

配置文件要用一个完整的路径 , 但完整的路径不是硬编码 , 而是通过某种方式运算出来的 .

用类加载器加载 :

ReflectTest.class getClassLoader().getResourceAsStream(“config.properties”);

类加载器加载的是只读的 , 不能保存 .

 

 

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

分享到:
评论

相关推荐

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    IBM JDK 1.5,全称为IBM Java Development Kit 1.5,是IBM公司为AIX操作...通过深入阅读IBM_jdk1.5_Guide.pdf,开发者可以掌握如何在AIX系统上部署和运行Java应用,同时利用IBM JDK 1.5的优势来提升应用性能和稳定性。

    JAVA帮助文档全系列_JDK1.5_、JDK1.6、_JDK1.7_官方中英完整版下载

    ### JAVA帮助文档全系列_JDK1.5_、JDK1.6、_JDK1.7_官方中英完整版下载 #### 概述 本文档提供了JDK(Java Development Kit)不同版本的下载链接及其相关介绍。JDK作为Java开发的核心组件,对于Java程序员来说至关...

    JDK1.5新特性

    JDK1.5新特性

    jdk1.5新特性

    ### JDK 1.5 新特性详解 #### 泛型编程 **定义与作用:** 泛型编程是 Java 1.5 引入的一项重要特性,它允许开发者在编译时进行类型安全检查,从而避免了运行时可能出现的类型转换异常。通过在编译阶段检查类型安全...

    详细介绍JDK1.5的各种新特性

    以下是JDK1.5中的主要新特性及其详细解释: 1. **泛型(Generics)**:泛型是JDK1.5引入的最大变革之一。它允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和重用性。泛型帮助程序员在编译时检查类型...

    Unsafe_jdk1.5_rt.jar

    在JDK 1.5中,要使用`Unsafe`类,开发者通常需要通过反射获取该类的实例。 导入`Unsafe`类的方法通常是这样的: ```java Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible...

    JDK_API_1_5_zh_CN(JDK1.5中文帮助文档)

    JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_...

    JAVA_jdk1.5笔记

    《JAVA_jdk1.5笔记》是一份专为初学者设计的详尽教程,涵盖了JAVA编程的基础知识,ANT构建工具的使用,以及单元测试的重要概念。这个资源集合旨在帮助新手快速掌握JAVA编程语言的核心概念,并熟悉开发过程中的自动化...

    jdk1.5 windows版本 64位

    它于2004年9月30日正式发布,引入了许多新的特性,如自动内存管理的增强(例如泛型、枚举、变量类型推断、增强的for循环),对XML支持的加强,新的日期/时间API,以及改进的反射机制。这些特性显著提升了Java编程的...

    How_to_install_JDK1.5_on_Ubuntu

    本文将详细介绍如何在Ubuntu 9.10操作系统上安装JDK 1.5,这一过程对于那些需要在较低版本的Java环境中进行开发的用户尤其重要,例如在进行某些Android应用开发时,可能因为兼容性问题而需要回退到JDK 5。...

    appengine-java-sdk-1.5.0.1.zip_JDK1.5.0.1_appengine-java-s_appen

    标签中包含的"jdk1.5.0.1"指的是Java的特定版本,即Java 5.0 Update 1。这是Oracle公司发布的Java平台标准版(Java SE)的一个版本,提供了许多改进和新特性,如泛型、枚举、注解和增强的for循环等。"appengine-java...

    jdk1.5x64位 windows版.zip

    综上所述,JDK1.5是Java发展历程中的一个重要里程碑,它的特性改进了编程体验,提升了代码质量和运行效率。而64位Windows版的JDK1.5,则是针对Windows用户的一种优化选择,满足了开发者在64位环境下的需求。文件"jdk...

    linux系统jdk1.5下载

    Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...

    Jdk1.5新特性

    博文链接:https://weibaojun.iteye.com/blog/70284

    详细描述jdk1.5新特性

    Java 5.0(也称为 JDK 1.5)引入了一系列重要的新特性,这些特性极大地提高了开发者的编程效率和代码质量。其中最显著的特性之一便是泛型(Generics)。本文将详细介绍泛型的概念、使用方式以及它如何帮助开发者编写...

    linux下JDK1.5

    JDK1.5引入了一些重要的新特性,如: 1. **Generics(泛型)**:允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。 2. **Autoboxing and Unboxing(自动装箱与拆箱)**:自动将基本类型与对应的...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    JDK 1.5新特性及应用

    JDK 1.5 是Java发展历程中的一个重要里程碑,它引入了一系列新特性,极大地提升了编程的效率和代码的可读性。以下将详细讲解其中的一些关键特性及其应用。 1. 类型安全的枚举(Type-Safe Enumerations) 在JDK 1.5...

    JDK1.5_22 JDK1.5_22

    总结来说,JDK 1.5_22是Java发展史上的一个重要里程碑,它的特性不仅极大地提高了开发者的生产力,也为Java应用程序的稳定性和安全性奠定了基础。对于那些需要在Java 5环境中开发和维护项目的人来说,这个版本的JDK...

Global site tag (gtag.js) - Google Analytics