----------------------------------------------------------------------------- android培训、java培训、期待与您交流! --------------------------------------------------------------------------------
Beanutils工具包
用ecplice加入jar包,分别导入BeanUtils和loading包,并设置BuildPath。
用BeanUtils代替上面的内省操作。
get属性返回的结果为字符串,set可设置任意类型的的对象,通常使用字符串。
PropertyUtils:get属性返回的结果为该属性本来的类型,set属性只接受该属性本来的类型。
Java的三个基本注解
注解:等于为程序打上了某种标记,可以加在类,包,字段,方法,方法的参数及局部变量上。
@Deprecated:标记此程序元素已过时,通常是因为它很危险或存在更好的选择。
@SuppressWarnings:取消显示指定的编译器警告。
@Override:表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
注解的应用
元注解@Retention--定义注解类的存在区域,有三种取值:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、 RetentionPolicy.RUNTIME,分别对应java源文件、class文件、内存中的字节码。
元注解@Target:确定注解类可用范围,取值ElementType.METHOD···
为注解增加基本属性
定义基本类型的属性
在注解类中增加String color();
引用:@MyAnnotation(color=“red”)
用反射获得注解对应的实例对象后,再通过对象调用属性对应的方法。
MyAnnotationa=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation)
System.out.println(a.color);
为属性定义缺省值Stringcolor() default “red”;
Value属性 String value();
如果一个 注解只有一个名称为value的属性,且你只想设置value的属性,可以省略,@MyAnnotation(“red”);
为注解增加高级属性
数组类型的属性
int[] arrayAttr () default{1,2,4,5};
@MyAnnotation(arrayAttr={2,3,4});如果数组中只有一个元素,则可以省略大括号。
枚举类型的属性
EnumTest.TracfficLamp lamp() default EnumTest.TracfficLamp.RED;
@MyAnnotation(lamp = EnumTest.TracfficLamp.YELLOW);
注解类型的属性
MetaAnnotation annotationAttr() default @MetaAnnotation(“lhm”);
@ MyAnnotation(annotationAttr = @MetaAnnotation(“flx”));MetaAnnotation为注解类
Class类型的属性
Class annotationClass() defaultString.class;
@MyAnnotation(annotationClass=String.class);
泛型
Jdk1.5的集合类在希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以外的数据。
ArrayList<Integer> c=newArrayList<<Integer>();
c.add(“abc”);//编译报错
泛型是提供给java编译器使用的,让编译器挡住程序的非法输入,对于参数化的泛型,getClass返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的信息,只要跳过编译器,就可以往泛型集合中加入其它类型的数据,如:用反射得到集合,再调用其add方法即可。
了解泛型
ArrayList<E>类定义和ArrayList<Integer>类引用中涉及的术语:
1、整个ArrayList<E>称为泛型类型
2、ArrayList<E>中E称为类型变量或类型参数
3、整个ArrayList<Integer>称为参数化的类型
4、ArrayList<Integer>中的Integer叫类型参数的实例或实际类型参数
5、ArrayList<Integer>中的<>念typeof
6、ArrayList称为原始类型
参数化类型与原始类型的兼容性-编译警告
Collection<String> = new Vector();
Collection = new Vector<String >();
参数化类型不考虑类型参数的继承关系
Vector<String> v = new Vector<Object>();//错!
Vector<Object> v = new Vector<String>();//错!
在创建数组实例时,数组的元素不能使用参数化的类型
Vector<Integer> v[] = new Vector<Integer>[10];
Vector v1 = newVector<Integer>();
Vector<Object> v = v1; //编译可以通过!编译器只会按行解释
泛型的?通配符及扩展
<?>可以引用各种参数化的类型,可以调用与参数无关的方法,不能调用与参数有关的方法
限定通配符的上边界
正确:Vector<? extends Number> v=newVector<Integer>();
错误:Vector<? extends Number> v=new Vector<String>();
限定通配符的下边界
正确:Vector<? Super Integer> v=newVector<Number>();
错误:Vector<? extends Integer > v=new Vector<Byte>();
通配符包括自己
定义泛型的方法
交换数组中两个元素的位置的泛型方法定义如下:
private static<T> void swap(T[] a,int i,int j){
Ttemp = a[i];
a[i]= a[j];
a[j]= temp; }
用于放置泛型的类型参数的尖括号应出现在方法的所有修饰符之后和返回类型之前。
只有引用类型才能作为泛型方法的实际参数,基本类型则不可以如:swap(new int[]{1,3},1,2);
定义泛型时也可以使用extends修饰符,如<Vextends Serializable&cloneable> void method();
也可以用类型变量表示异常,可以用于方法的throws列表中,但不能用于catch中。
泛型中可以有多个类型参数,在定义它们的尖括号中用逗号分开。Publicstatic <K,V> V getValue(K key) {return map.get(key);}
定义泛型类
类中的多个方法要使用同一个泛型参数,此时要定义类级别的泛型。
public classGenericDao<T>{
private Tfield1;
public void save<Tobj>{}
public T getById(intID){}
}
类级别的泛型是根据引用类名指定的泛型信息来参数化变量的.
GenericDao<String> dao=null;
new GenericDao<String>();
注意
1、在对泛型参数化时,必须是引用类型,不能是基本类型。
2、当一个类被声明为泛型时,只能被实例变量和方法调用(还有内嵌类),而不能被静态变量和静态方法调用。因为类静态成员是被所有参数化的类所共享的,所以静态成员不应该拥有类级别的类型参数。
通过反射获得泛型的参数化类型
Vector<Date> v= new Vector<Date>();
通过v.getClass()是无法获得泛型的参数化类型的。
将其传递给一个方法,可实现此功能。
public static void applyVector(Vector<Date> v){}
Method applyMethod =GenericTest.class.getMethod("applyVector", Vector.class);
Type[]types = applyMethod.getGenericParameterTypes();
ParameterizedTypepType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());//Vector
System.out.println(pType.getActualTypeArguments()[0]);//Date
类加载器的委托机制
当java虚拟机加载类时,到底用哪个类加载器?
首先当前线程的类加载器去加载线程中的第一个类
如果类A引用了类B,那么java虚拟机将使用加载类A的类加载器去加载类B
还可以直接调用ClassLoader.loaderClass()方法来指定某个类加载器去加载
每个类加载器加载时,又委托给其上级的类加载器。
当所有祖宗类加载器没有加载到该类,则回到发起者类加载器,还加载不到,则抛出ClassNoFoundException,不是再找发起者类加载器和儿子,因为没有getChild方法。——从上到下的加载。
自定义类加载器
工作机制
父类——>loadClass/findClass()/得到class文件的内容转换成字节码—>difineClass()/将一个byte 数组转换为 Class 类的实例
实现步骤
自定义的类加载器必须继承ClassLoader
覆盖findClass方法
覆盖difineClass()方法
用自定义加载类实现加密及解密-难!
查看视频及源文件 MyClassLoader.class
----------------------------------------------------------------------------- android培训、java培训、期待与您交流!--------------------------------------------------------------------------------
详细请查看:http://edu.youkuaiyun.com/heima/