---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
七.javaBean内省(IntroSpector)
·javaBean简单的内省操作: 获取X属性的步骤
Class1 class1 =new Class1();
String propertyName="x";
PropertiesDescriptorpd=new PropertiesDescriptor(propertyName,class1.getClass());
MethodmethodGetX=pd.getReadMethod();
Object retVal=methodGetX.invoke(class1);
·采用遍历BeanInfo的所有属性方式来查找和设置某个类对象的属性。在程序中把一个类当作JavaBean
来看,就是调用IntroSpector.getBeanInfo方法, 得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。
方法:IntroSpector.getBeanInfo()获取对象--->通过BeanInfo的getPropertyDescriptors()方法获取对象的所有属性,
遍历属性数组,找到所需要的属性然后对其进行操作
八.beanutils工具包:不仅可以操作javaBean也可以操作Map
·用eclipse如何加入jar包
将jar包复制到工程目录下,然后设置Build path
·BeanUtils
1.用BeanUtils类先get原来设置好的属性,再将其set为一个新值。get属性时返回的结果为字符串,set属性时
接受任意类型的对象,通常使用字符串。
2.用PropertyUtils类先get原来设置好的属性,再将其set为一个新值。get属性时返回的结果为该属性本来的类
型 ,set属性时只接受该属性本来的类型。
3.java7的一个新特性Map集合可以向下面的方式来定义
Map map={name :”zhangsan”,age:18};
九.注解(annotation)
·注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,
javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就
去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
·定义一个最简单的注解:public @interface MyAnnotation {}
·元注解(@tetention)有三种取值Retentionploicy.SOURCE, Retentionploicy.CLASS, Retentionploicy.RUNTIME分别对应的
时期是java源文件、class文件、内存中的字节码。
@Target元注解,Target的默认值为任何元素,设置Target等于ElementType.METHOD则该注解只能加在方法上
如果想把注解加在多个元素上可以用数组的方式设置{ElementType.METHOD, ElementType.type}
·为注解增加属性
public@interface MyAnnotation {
publicabstract String color(); default “black”;
public abstract String value();
}
给注解增加属性
@Myannotation(color=”red”,value=”hello”)
当注解的属性只有一个value的属性时可以写为@Myannotation(”hello”)
多个属性时可以为属性指定缺省值public abstract String color(); default “black”;这时属性就可以写为@Myannotation(”hello”)
·数组类型的属性
int[] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr=(2,3,4));
如果数组属性中只有一个元素,这时候属性值部分的可以省略大括号
·枚举类型的属性
EnumTest.TrafficLamplamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
·注解类型的属性
MetaAnnotationannotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
十.泛型(JDK1.5新特性)
·使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。
泛型定义在方法上:
·泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。
·泛型中的?通配符
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
·只有引用类型才能作为泛型方法的实际参数,swap(new int[3],3,5);语句会报告编译错误
·通配符方案要比范型方法更有效,当一个类型变量用来表达两个参数之间或者参数和返回值之间的关系时,即同
一个类型变量在方法签名的两处被使用,或者类型变量在方法体代码中也被使用而不是仅在签名的时候使用,才需要使用范型方法。
泛型定义在类上:
如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型,语法格式如下:
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getById(int id){}
}
·在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
·当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数
通过反射的方式获取泛型的参数类型:
Method appplyMethod=类名.class.getMethod("方法名", 参数.class);
Type[] types=appplyMethod.getGenericParameterTypes();
ParameterizedType parameterizedType=(ParameterizedType)types[0];
pType.getRawType();//获取原类型
pType.getActualTypeArguments();//获取实际参数化类型
十一.类加载器及委托机制
·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
·类加载器的管辖范围
BootStrap-->JRE/lib/rt.jar ExtClassLoader--> JRE/lib/ext/*.jar AppClassLoader-->classPath指定的所有jar和目录。
·委托类加载机制
java虚拟机要加载一个类时用到类加载器的顺序,首先由BootStrap加载,找不到后才一级一级向下由子类加载,直到发起者的类加载器,即使到了发起者也找不到,那么类加载器也不会向下让子类加载器BootStrap--->ExtClassLoader--->AppClassLoader(一般不能自己写一个java.lang.System类让类加载器加载,因为类加载器加载的时候总是由BootStrap开始只要找到了要加载的类就不会加载自己写的类,只加载系统的System)
·模版方法设计模式
多个子类继承父类时,子类实现功能的顺序相同,只是每个子类实现的方式不同,所以将实现功能的顺序定义成父类的抽象方法,具体的实现由子类覆盖父类的抽象方法来完成,这称为模版方法设计模式。
·自定义类加载器
1.自定义的类加载器要继承ClassLoader
2.覆盖ClassLoader中的findClass()方法(返回值类型是Class)
十二.代理(Proxy )
·JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
·JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。
·代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个
位置加上系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中
Class proxy{
voidsayHello(){
……….
try{
target.sayHello();
}catch(Exceptione){
………..
}
………….
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------