java高级特性_2

来源:互联网 发布:花生壳ddns 免费域名 编辑:程序博客网 时间:2024/04/30 14:53

1、反射

反射就是把java类中的各种成分映射成相应的java类。例如:一个java类中用一个class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等信息也用一个个java类表示,就像汽车是一个类,汽车中的发动机,变速箱等也是一个个类。

class类   如何得到各个字节码对应的实例对象?

  类名.class   如:System.class

  对象.getClass()   如:Data().getClass()

  class.forName(“类名”)  如:Class.forName("java.util.Date")

 

2、Constructor类

Constructor类代表某个类中的构造方法

Field类

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

Method类

Method类代表某个类中的一个成员方法

如果传递给Method对象的invoke()方法的一个参数为null,说明该Method对象对应的是一个静态方法

 

3、数组的反射

1、具有相同维数和元素类型的数组属于一个类型,即具有相同的Class实例对象

2、代表数组的Class实例对象的getSuperChass()方法返回的父类为Object类对应的Class

3、基本类型的一维数组可以被当做Object类型使用,不能当做Object类型使用,非基本类型的一维数组,既可以Object类型使用,又可以当做Object类型使用

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

4、内存泄露

内存泄露就是一个对象不用了,但一直占用内存空间,没有被释放。

5、内省(IntroSpector)

        1、JavaBean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

        2、如果在两个模块中传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值(Value Object)简称VO.这些信息在类中用私有的字段类存储,如果读取或设置这些字段的值,则需要通过一些相应的方法访问。

javaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。

JDK中提供了对JavaBean进行操作的API,这套API就称为内省。如果要通过关getXxx方法类访问私有的X,用内省这套API操作JavaBean比普通类方式更方便。

   getXxx()   不接受参数

   setXxx(type  Ooo)   要接受参数

 

class  Person{

      private int x;

      public  int  getAge(){

                return  x;

            }

      public  void setAge(int  age){

                  this.x = age;

             }

     }

 

6、元注解

            J2SE5.0 为注解单独提供了4种注解,即元注解,属于java.lang.annotation 包中。它们是@Target、@Retention、@Documented和@Inheried

       1、@Targe

       作为元注解类型的@Target,它描述了注解所适用的程序元素的种类。当一个注解类型没有@Target时,则表明该注解可适用于所有程序元素上。当存在@Target时,编译程序将强制实施指定的使用限制。

      @Target所指的目标就是java的语言元素如类接口方法等。当然,@Target还可以对其他元素进行限制,如构造方法字段参数等。@Target中元素的值不能重复出现,负责编译出错。

       2、@Retention

     既然可以自定义注解,当然也就可以读取程序中的注解。annontation的@Retention定义了该annotation被保留的时间长短:某些annotation仅出现在源代码中,但被编译器丢弃l 

       3、@Documented

       @Documented这个注解和它的名字一样于文档有关。在默认的情况下使用javaadoc或其他的类似工具自动生成文档时,注解被忽略掉。如果想在文档中也包含注解,必须使用@Documented为文档注解。

       4、@Inherited

       @Inheried也是一个标记型标记,表示注解类型会被自动继承。如果一个使用了@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。

 

7、泛型(JDK1.5的新特性)

  泛型是提供给java编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译时带类型说明的集合时会去掉“类型”信息,使程序运行效率不受影响。

 泛型的最大特点:类中的属性的类型可以由外部决定,声明类的时候:

    class  类名称<泛型类型,泛型类型......>{..........}

  一个泛型类就是具有一个或多个类型变量的类,即泛型类可以带有两个及以上类型参数,参数之间用逗号分隔。

泛型方法:

   定义泛型方法,只需将泛型参数列表置于返回值之前。类型变量放在修饰符的后面,返回类型的前面。在前面的示例中,当使用泛型类时,必须在创建对象的时候指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会根据参数值判断出具体的类型。 必须通过对象的引用,才能调用泛型方法。如this.<Double>f(3.14),不能简化成.<Double>f(3.14)

  可变参数是1.5的新特性,可变参数可用于泛型方法表示声明一个就受可变数目参数的泛型方法,可变参数必须是方法声明中的最后一个参数。

8、泛型通配符

  参数化类型必须是List类型或其子类型,要满足这种要求,可以使用”?“通配符,并使用”extends“关键字限定参数类型。例如:

   Generics<?  extends  List>gen = null;

   gen = new Generics<ArrayList>();

   gen = new Generics<LinkedList>();

如果指定不是List的类型或者子类型,则编译会报告错误。如:

     Generics <?  extends   List>gen = new Generics <HashMap>();

如果只指定了<?>而不使用”extends “关键字,则可以是Object类及其子类,也就是所有的类了

java并不能创建泛型数组,需要创建数组的地方使用ArrayList  .如:

  public class  Generics<T>{

            private  List<T> arr   = new  ArrayList<T>();

             public  void  add(T  item){

                            arr.add(item);

                   }

               public  T   get(int  index){

                                return   arr.get(index);

                       }

        }

9、类加载器

     加载类的工具

1、JVM中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类。

    BootStrap     ExtclassLoader     AppClaaLoader

2、;类加载器也是java类

3、JVM中所有的类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象是,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

 

10、代理

JVM可以在运行期间动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。

JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口目标类的代理。

CGLIB库可以动态的生成一个类的子类,一个类的子类也可以用作类的代理,所以,如果为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。

代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以代理方法和对外返回目标。可以在代理类中的如下四个位置加上系统功能代码:

      1、在调用目标方法之前

      2、在调用目标方法之后

     3、在调用目标方法前后

     4、在处理目标方法异常的catch块中