黑马程序员----Java高新技术2

来源:互联网 发布:淘宝开店 虚拟商品 编辑:程序博客网 时间:2024/03/29 06:21

 ------- android培训、java培训、期待与您交流! ----------

由内省(IntroSpector)引出JavaBean

JavaBean是一个特殊的Java类,方法的名字符合某种特殊的规则。int getXXX(),void setXXX(int age) ,isXXX()等。如果成员变量的第二个字符时小写,则方法应把成员变量第一个字母大写,例如private String n
ame 对应getName()

通过反射机制调用JavaBean中的方法

RefectPoint rf =new RefectPoint(3,5);

String propertyName="x";

PropertyDescriptor pd=new PropetyDescriptor(propetyName,rf.getClass());

Method methodGetX=pd.getReadMethod();

Object returnValue=methodGetX.invoke(rf);

Method methodSetX=pd.getWriteMethod();

methodSetX.invoke(rf,6);

BeanInfo对象把某个类当做JavaBean看待。

BeanInfo beanInfo=Introspector.getBeanInfo(rf.getClass());

PropertyDescriptor[] propertyDescriptors =beanInfo.getPropertyDescriptors();

for(PropertyDescriptor propertyDescriptor:propertyDescriptors){

if(propertyDescriptor.getName().equals(propertyName)){

     Method methodGetName=propertyDescriptor.getReadMethod();
     Object retVal=methodGetName.invoke(person);

}
}

BenUtils工具包操作JavaBean,apache提供了BeanUtils工具包。

BeanUtils.setProperty(rf,"birthday.time","2222");Java7新特性Map map ={name:"lisi",age:6}

Java1.5新特性注解应用

@Override 子类重写父类的方法,如果不是重写会报编译异常

@Deprecated的作用是对不应该在使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数。用来标记过时的方法。

@SuppressWarnings,其参数有:

  deprecation,使用了过时的类或方法时的警告

  unchecked,执行了未检查的转换时的警告

  fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告

  path,在类路径、源文件路径等中有不存在的路径时的警告

  serial,当在可序列化的类上缺少serialVersionUID 定义时的警告

  finally ,任何 finally 子句不能正常完成时的警告

  all,关于以上所有情况的警告

注解应用结构:注解类---》应用了注解类的类---》对“应用了注解类的类”进行反射操作的类

@Retention(RetentionPolicy.RUNTIME),注解保留在何处,分为源代码,运行时,字节码中
@Target(ElementType.METHOD)           ,表示注解可以加载什么地方,有包,方法,参数,类,接口,构造方法等

为注解增加属性:

@ItcastAnnotation(color = "Red")

注解类

public @interface ItcastAnnotation {
 public   String color();
}

如果只有value要知道值的话,可以省略value=,直接赋值。

Java1.5新特性泛型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型是提供给Java编译器使用的,让编译器当中源程序的非法输入,编译器编译带类型说明的集合时会去掉集合的类型信息,是程序运行效率不受影响。对于参数化的泛型类型,getClass方法的返回值和原始类型是一样的。只要跳过编译器,就可以往某个类型的集合中加入其它类的元素。

参数化类型不考虑类型参数的继承关系。

Vector<String> v =new Vector<Object>() 和Vector<Object> v =new Vector<String>()都是错误的。

在创建数组实例时,数组元素不能使用参数化类型

Vector<Integer> vectorList[] =new Vector<Integer>[10].是错误的。

泛型的?通配符扩展

限定符的上边界:? extends Number 表示类型是Number类型或者是Number的子类。

限定符的下边界: ?super Integer  Vector<? super Integer> v =new Vector<Number>();是正确的

泛型集合的综合应用

HashMap<String, Integer> map =new HashMap<String, Integer>();
  map.put("lisi", 34);
  map.put("masan", 56);
  Set<Map.Entry<String,Integer>> set =map.entrySet();//HashMap的entrySet()方法返回的是Set<Map.Entry<K,V>>集合。
  for (Entry<String, Integer>entry :set) {
   System.out.println(entry.getKey()+"="+entry.getValue());
  }

自定义泛型及其应用,自定义数组指定位置元素交换,只有引用类型才能作为泛型方法的参数。

private static <T> void swap(T[] arr,int i,int j){
  T temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
 }

通过反射获得泛型实际参数的类型,其实并不是真正的通过创建的泛型的实例来得到的,而是通过泛型变量传参函数取得的泛型变量类型。

public static void applyDate(Vector<Date> v){
  
 }

    Method applyDateMethod=AnnotationTest.class.getMethod("applyDate", Vector.class);
    Type[] types= applyDateMethod.getGenericParameterTypes();
    ParameterizedType parameterizedType=(ParameterizedType) types[0];
    System.out.println(parameterizedType.getActualTypeArguments()[0]);//取得泛型传参的类型
    System.out.println(parameterizedType.getRawType());//获得参数的原始类型

类加载机制及其委托机制的深入分析

系统默认有三个类加载器:BootStrap(JRE/lib/rt.jar),ExtClassLoader(JRE/lib/ext/*.jar),AppClassLoader(ClassPath下指定的所有的jar包或目录),BootStrap不是Java类,而是嵌套在JVM虚拟机中的,用C/C++写的。自己创建类加载器是是挂载在AppClassLoader上的,类加载器是从上往下进行加载的,如果父类可以加载的话,那么就不会再调用子类进行加载。

 ------- android培训、java培训、期待与您交流! ----------