黑马程序员-----JAVA新特性


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



Java语言的升级,带来了许多的好处,提供了许多的便利,JDK1.5的新特性有静态导入,可变参数,枚举,注解,增强for循环,内省等,下面对这些新特性做了一些总结:

 

1  静态导入:

例如:Import  static  java.lang.Math.*;

 

2  可变参数:

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

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

public static int add(int x,int … args)  表示可以接收若干个整数

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




3  增强for循环:

Ctrl+shift+/:是注释整个段落

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

注意事项:

1  迭代变量必须在()中定义

2  集合变量可以是数组或实现了Iterator集合的集合类




4  基本数据类型的自动拆箱与装箱:


自动拆箱:

  Inerger iobj=3;

装箱:

  System.out.println(iobj+12);

示例:

Integer i1=13;

Integer i2=13;

System.out.println(i1==i2);   这个的结果为true

Integer i1=137;

Integer i2=137;

System.out.println(i1==i2);   这个的结果为false


这是为什么呢?

对于这些基本数据类型的整数,要装箱成为Integer对象的时候,如果这些数据在-128~127之间的这些数据,一旦被包装成Integer对象后,就会缓存起来,缓存到一个池中,在下次又要把数据装到Integer里面,先看池中有没有,如果有则直接从池中获取,这样节省了内存的空间。

Integer num5=Integer.valueOf(12);  //这个静态方法是将一个整数变成Integer,是手动调用一个静态方法,将基本类型变成Integer

Integer num6=Integer.valueOf(12);

System.out.println(num5==num6);  这个结果为true


5  用类加载器的方式管理资源和配置文件:


配置文件应该放在什么地方?

getRealPath();得到对应的真实的位置

一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的


常用的方式:类加载器

但是这种方式的配置文件是只读的

InputStream in=reflectSet.class.getClassLoader().getResourceAsStream("itheima\\config.properties");

 

加载资源的时候:先找到这个类,然后在用这个类去找类加载器

reflectSet.class  类

getClassLoader();这个是类加载器

getResourceAsStream("itheima\\config.properties");用类加载器去加载资源

但是这种方式的可以用于保存,在写一个OutputStream用于保存

InputStream in=new FileInputStream("config.properties");

也可以用这种方式:

InputStream in=reflectSet.class.getResourceAsStream("config.properties");

 

6  内省(IntroSpector),了解JavaBean


什么是JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则;如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object 简称VO

JavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,去掉set前缀,剩余的部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

(1)  setId()的属性名——>id

(2)  isLast()的属性名——>last

(3)  setCPU的属性名是——>CPU

(4)  getUPS的属性名是——>UPS

总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量

 

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一个额外的好处,好处如下:

1  JavaEE开发中,经常要使用JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地了

2  JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要自己去通过getX方法来访问私有的x,怎么做,有一定难度?用内省这套API操作JavaBean比用普通类得方式更方便。

需求:用内省的方法来读取JavaBean中的属性




对上面这个例子的解析总结:

get方法:

    * 首先对reflectClass这个对象进行操作,并且将其当成JavaBean来进行操作

    * 获取x的属性名

    * PropertyDescriptor是属性描述符,里面的参数是属性的名字和当作JavaBean的类 就是reflectClass这个类,

    * 相当于从这个JavaBean类中获取前面的参数,也就是属性

    * 得到了这个属性,继而就可得到这个属性的get和set方法(getReadMethod()和getWriteMethod())

    * 因为是获取属性的值,也就相当于读取属性的值,所以使用getReadMethod()这个方法

    * 这两个方法的返回类型是Method,Method methodGetX=pd.getReadMethod();

    * methodGetX.invoke(rc)用这个方法定义的methodGetX这个变量去调用invoke方法,

    * 在哪个对象上调用呢?在rc上调用,rc是reflectClass类得实例对象,

    * 又因为get方法没有参数类型,所以invoke里面就一个参数

    * 因为get方法有返回值类型,但是我们并不知道是什么类型的,所以使用Object来接收

set方法:

    * 上面和get的描述是一样的

    * 因为是设置属性的值,也就相当于写属性的值,所以使用getWriteMethod()这个方法

    * 因为set方法没有返回类型,可直接调用invoke方法

    * methodSetX.invoke(rc,9)用这个方法定义的methodSetX这个变量去调用invoke方法,

    * 因为set方法里面有参数,所以要给这个x设置的值就直接写在invoke方法中


复杂的内省操作:

主要记住的是  IntroSpector.getBeanInfo  这个类的静态方法

只要调用这个方法,并给这个方法传递一个对象、属性名和设置值,它就能完成属性修改的功能。

 

这个例子的逻辑可以用于有一个集合,从集合中查找某一个特定的元素,找到这个元素在对这个元素进行操作。


7  反射

反射就是加载类的class文件,并解析里面的数据。利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。

1  Class类

Class: 根据所有类的class文件所抽象出的类型如何得到某个class文件对应的class对象。

Class.forName(“类名”) 用全类名。


1.1  Class类的常用方法

        Field getField(String name) 根据名称得到代表某个属性的Field对象。

        Field[] getFields() 得到所有属性的Field对象数组。

        Constructor getConstructor(Class... parameterTypes) 得到代表某个构造方法的Constructor对象。

        Constructor[] getConstructors() 得到代表所有构造方法的Constructor对象数组。

        Method getMethod(String name, Class... parameterTypes) 得到代表某个一般方法的Method对象。

        Method[] getMethods() 得到代表所有一般方法的Method对象数组。


2  Constructor类

       Constructor类的对象代表类的一个构造方法。

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

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

        得到某一个构造方法,例: 

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

        利用构造方法创建实例对象。

        String str = (String)constructor.newInstance(“abc”);

        Class类的newInstance()方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。         String obj =(String) Class.forName(“java.lang.String”).newInstance();


3  Method类

Method类代表某个类中的一个一般方法

得到类中的某一个方法:

例子: Method charAt = Class.forName( “java.lang.String” ).getMethod( "charAt", int.class);

调用方法:

        通常方式:System.out.println(str.charAt(1));

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

如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!


4  Field类

Field类代表某个类中的一个成员变量

字段fieldX 代表的是x的定义,而不是具体的x变量。

示例代码:

      ReflectPoint point = new ReflectPoint(1,7);

      Field y = Class.forName( "cn.itcast.corejava.ReflectPoint“ ).getField( "y“ );

      System.out.println(y.get(point));

      //Field x = Class.forName( "cn.itcast.corejava.ReflectPoint“ ).getField( "x“ );

      Field x = Class.forName( "cn.itcast.corejava.ReflectPoint“ ).getDeclaredField( "x");

      x.setAccessible(true);

      System.out.println(x.get(point));



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值