javaweb学习总结(java增强)
2013-12-26 16:08
281 查看
1、可变参数:测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。
注意:传入基本数据类型数组的问题。
2、反射:反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
2.1、类加载器:类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象。
当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构:
①BootStrap:(JRE/lib/rt.jar)引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。
②ExtClassLoader:(JRE/lib/ext/*.jar)扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。
③AppClassLoader :(CLASSPATH指定的所有jar或目录) 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器
2.1.1、Class类:Class类用于表示.class文件
如何得到某个class文件对应的class对象。
①类名.class,
②对象.getClass()
③Class.forName(“类名”)
2.1.2、全盘负责委托机制:classloader 加载类用的是全盘负责委托机制。
①全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的其它Class通常也由这个classloader负责载入。
②委托机制:先让parent(父)类加载器 寻找,只有在parent找不到的时候才从自己的类路径中去寻找。
③类加载还采用了cache机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因。
2.2、Constructor类的实例对象代表类的一个构造方法。
2.3、<
4000
/span>Field类代表某个类中的一个成员变量:一般要考虑访问权限的问题(即在声明变量的时候声明成private),需设置setAccessible(true)
2.4、Method类代表某个类中的一个成员方法,一般会调用方法:invoke(Object obj, Object... args),当该Method对象对应的是一个静态方法,第一个参数可以设置为null。
2.4.1、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方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用method方法的代码也可以用Jdk1.4改写为 method.invoke(“str”, new Object[]{1})形式。
2.5、用反射方式执行某个类中的main方法:mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
3、内省(Introspector) — JavaBean
3.1通过内省技术访问JavaBean属性(java.beans包提供了内省的API),内省技术访问也提供了两种方式。
3.1.1、通过PropertyDescriptor类操作Bean的属性
3.1.2、通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
3.2、内省—beanutils工具包 (Apache)常用类:
BeanUtils
PropertyUtils
ConvertUtils.regsiter(Converter convert, Class clazz)
自定义转换器
4、泛型(Generic):JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
4.1、泛形的基本术语,以ArrayList<E>为例:
<>念着typeof
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型ParameterizedType
4.2、自定义泛形:Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例如:
public static <T> void doxx(T t);
5、Annotation(注解,即元数据(MetaData) ):用于替代配置文件
5.1、定义新的 Annotation 类型使用 @interface 关键字
5.2、Annotation 的属性声明方式:String name();
5.3、特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如@MyAnnotation(“xxx")
5.4、特殊属性value[];
6、元 Annotation指修饰Annotation的Annotation
6.1、@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留的域, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 通过这个变量指定域:
6.1.1、RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值
6.1.2、RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
6.1.3、RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
6.2、@Target:指定注解用于修饰类的哪个成员
6.2.1、@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
6.2.2、@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
7、动态代理:Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需要三个参数:
7.1、生成代理对象使用哪个类装载器
7.2、生成哪个对象的代理对象,通过接口指定
7.3、生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。
注意:传入基本数据类型数组的问题。
2、反射:反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
2.1、类加载器:类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象。
当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构:
①BootStrap:(JRE/lib/rt.jar)引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。
②ExtClassLoader:(JRE/lib/ext/*.jar)扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。
③AppClassLoader :(CLASSPATH指定的所有jar或目录) 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器
2.1.1、Class类:Class类用于表示.class文件
如何得到某个class文件对应的class对象。
①类名.class,
②对象.getClass()
③Class.forName(“类名”)
2.1.2、全盘负责委托机制:classloader 加载类用的是全盘负责委托机制。
①全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的其它Class通常也由这个classloader负责载入。
②委托机制:先让parent(父)类加载器 寻找,只有在parent找不到的时候才从自己的类路径中去寻找。
③类加载还采用了cache机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因。
2.2、Constructor类的实例对象代表类的一个构造方法。
2.3、<
4000
/span>Field类代表某个类中的一个成员变量:一般要考虑访问权限的问题(即在声明变量的时候声明成private),需设置setAccessible(true)
2.4、Method类代表某个类中的一个成员方法,一般会调用方法:invoke(Object obj, Object... args),当该Method对象对应的是一个静态方法,第一个参数可以设置为null。
2.4.1、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方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用method方法的代码也可以用Jdk1.4改写为 method.invoke(“str”, new Object[]{1})形式。
2.5、用反射方式执行某个类中的main方法:mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
3、内省(Introspector) — JavaBean
3.1通过内省技术访问JavaBean属性(java.beans包提供了内省的API),内省技术访问也提供了两种方式。
3.1.1、通过PropertyDescriptor类操作Bean的属性
3.1.2、通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
3.2、内省—beanutils工具包 (Apache)常用类:
BeanUtils
PropertyUtils
ConvertUtils.regsiter(Converter convert, Class clazz)
自定义转换器
4、泛型(Generic):JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
4.1、泛形的基本术语,以ArrayList<E>为例:
<>念着typeof
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型ParameterizedType
4.2、自定义泛形:Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例如:
public static <T> void doxx(T t);
5、Annotation(注解,即元数据(MetaData) ):用于替代配置文件
5.1、定义新的 Annotation 类型使用 @interface 关键字
5.2、Annotation 的属性声明方式:String name();
5.3、特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如@MyAnnotation(“xxx")
5.4、特殊属性value[];
6、元 Annotation指修饰Annotation的Annotation
6.1、@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留的域, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 通过这个变量指定域:
6.1.1、RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值
6.1.2、RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
6.1.3、RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
6.2、@Target:指定注解用于修饰类的哪个成员
6.2.1、@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
6.2.2、@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
7、动态代理:Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需要三个参数:
7.1、生成代理对象使用哪个类装载器
7.2、生成哪个对象的代理对象,通过接口指定
7.3、生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。