javaweb学习总结(java增强)

来源:互联网 发布:淘宝店铺购买 编辑:程序博客网 时间:2024/05/19 04:26

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.1Class类: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.2Constructor类的实例对象代表类的一个构造方法。

2.3Field类代表某个类中的一个成员变量:一般要考虑访问权限的问题(即在声明变量的时候声明成private),需设置setAccessible(true)

2.4Method类代表某个类中的一个成员方法,一般会调用方法:invoke(Object obj, Object... args),当Method对象对应的是一个静态方法,第一个参数可以设置为null

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

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

Jdk1.4public 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.2Annotation 的属性声明方式:String name();

  5.3、特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如@MyAnnotation(xxx")

  5.4、特殊属性value[];

6、元 Annotation指修饰AnnotationAnnotation

6.1@Retention: 只能用于修饰一个 Annotation 定义用于指定该 Annotation 可以保留的域, @Rentention 包含一个 RetentionPolicy 类型的成员变量通过这个变量指定域:

6.1.1RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中当运行 Java 程序时, JVM 不会保留注解这是默认值

6.1.2RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中当运行 Java 程序时, JVM 会保留注解程序可以通过反射获取该注释

6.1.3RetentionPolicy.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接口的实现来指定。

0 0