黑马程序员——java高新技术2学习笔记整理

来源:互联网 发布:收音机mac版 编辑:程序博客网 时间:2024/06/04 18:58
------- android培训、java培训、期待与您交流! ----------

java高新技术2学习笔记整理
1:BeanUtils工具包:提供了一些静态方法,可以操作JavaBean的类,BeanUtils.getProperty(p,"age");   返回的是个字符串。
 调用了getProperty方法,获取了p对象中的name变量的值。
BeanUtils.setProperty(p,"age","30");   将p对象中的name变量的值设置为了"30"。 将int类型的值以String类型传入,它会自动转换。
这里值得注意的是还有一个类PropertyUtils也有相同的方法,PropertyUtils.setProperty(p,"age",20);
这里的变量的值是以变量本身的类型来操作的,而不是一String类型,跟上面有所区别。
注意:这2个方法传入的变量的值的参数是String类型。
2:java1.7的一个新特性,Map map={name:"panxing",age:22};   可以这样定义一个Map集合的元素。
3:注解(Annotation):注解是用来给javac编译器或者eclipse开发工具提供某些信息的。一个注解是一个类。写一个注解就相当于写了一个类。
a、如果程序中调用了某个已过时的方法,编译器或者eclipse会提示该方法已过时,为了取消这个提示,可以在这个方法上面加上一个@SuppressWarnings(“deprecation”),取消过时警告。
b、在某个方法上面加上一句:@Deprecated   表示这个方法已经过时。告诉后面用这个方法的人最好不要用了。但是也不能将这个方法删除,因为有人调用了这个方法,删除了的话别人的程序就会出错。
c、检查 某个方法是否出错但是编译器又不现实错误,则可以在这个方法上面加上@Override注解。例如当覆盖equals方法时传入的参数应该是Object对象,而如果传入了其他参数,则加上这个标记就可以检查出这个错误。
以上是3个注解的应用。
标记除了可以加在方法上面,还可以加在类,包,成员变量,局部变量等上面。
4:注解的应用:自定义一个注解,将该注解应用到某个类上面,在通过一个类调用这个加了注解的类验证这个注解。一共要用到3个类。
public @interface ItcastAnnotation {}   自定义一个注解。
根据时期的不同,注解会保存到3个不同的时期:一个是java源文件时期,一个是class文件也就是编译时期 ,还有一个是运行时期——内存中的字节码。
这是可以在注解上面在增加一个注解@Retention,有3种不同的取值分别对应不同的时期:
1、RetetionPolicy.SOURCE  2、RetentionPolicy.CLASS  3、RetetionPolicy.RUNTIME     这3个值是一个枚举类中的值。
@Target  注解的作用:用于说明该注解可以用在哪个成分上面。如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
ElementType是一个枚举,还有很多其他的成员。
Type:一个接口,用来描述事物的类型。包括接口,枚举,注解,类等都是一个类型。
20:给注解增加属性:
public @interface ItcastAnnotation {
 String color()   default "red";   让color属性的值默认是red。
 String value();        当注解只有一个属性的时候,可以不写属性名,直接写属性的值。
 NewAnnotation AnnotationAttr() default @NewAnnotation(value="newvalue");    
}
 注解中的属性是一个注解,返回只是一个注解的对象,这个返回来的实例对象的注解还必须加上他自己的属性。
 给注解加了2个属性,那摩在用该注解的时候也必须要加上这2个属性。
@ItcastAnnotation("zhujie")      用该注解的时候可以这样写,color的值是red,value的值是zhujie。
注解的属性还可以是枚举,也可以是注解。
5:泛型:泛型会在虚拟机编译完之后给去掉。比如有2个集合,一个是存放String类型的集合,一个是存放Integer类型的集合,编译完之后类型相同。
虚拟机不知道编译完后集合中的元素的类型。只是给编译器看的。
如果定义一个集合,该集合指明了存放的元素是String类型,应为泛型是给编译器看的,此时我可以通过反射的方式拿到该集合的方法,指明我要添加的任意元素。
因为拿到该集合的字节码文件之后泛型已经去掉了,所以可以随意添加任意元素。
public static void main(String[] args) throws Exception{
  Collection<String> collection=new ArrayList<String>();       指明了泛型为String
  collection.add("abc");
  collection.add("qqq");
  System.out.println(collection);
  Method collectionMethod=collection.getClass().getMethod("add",Object.class);     拿到字节码后得到add方法,指明类型为Object
  collectionMethod.invoke(collection, 5);     往集合中添加了一个Integer照样可以。
  System.out.println(collection);
 }
6:泛型理解:ArrayList<E>   E称为泛型的类型参数或者类型变量。       ArrayList<String>   String称为类型的实例参数。
Colng> c=new Vector();    可以这样写,但是编译器会给警告。
Collection c=new Vector<String>();  也可以,同上。
一下2行代码不会报错,因为编译器是一行一行读的,不能把2行代码结合起来看。
Vector v=new Vector<String>();
Vector<Object> v=v;
7:通配符:Vector<String> x;
在方法上定义泛型时,如果参数中定义了任意类型的参数,则必须要在返回值前面说明:
例如:public static <T>void swap(T[] arr,int x,int y)     T 只能是引用数据类型,不能是基本数据类型。
 注:泛型类中的静态方法定义的泛型跟该方法的泛型没有关系,因为静态方法不用对象调用。
8:类加载器:类加载器本身自己也是一个类,加载这个类加载器的类的是BootStrap,但是它不是一个java类,它不需要被别人加载,它是嵌套在java虚拟机内核中的。比如System类,就是由它加载。不同的类加载器负责加载不同的类:
BootStrap--------》JRE/lib/rt.jar          比如:System类等。
ExtClassLoader-----------》JRE/lib/ext/*.jar     比如util中的类等。
AppClassLoader----------》Classpath指定的jar和我们自己写的class文件。
9:类加载器的委托加载机制:当某个类加载器去加载某个类时,会先委托上级,一直推到最顶层的类加载器去加载该类,如果最顶层的类加载器没有没有加载到该类,则有往下推,如果父类类加载器都没有加载到该类,则又有发起者来加载该类,如也没加载到,则会抛出ClassNotFoundException异常。
10:自定义类加载器:自定义的类加载器必须继承ClassLoader,覆盖ClassLoader中的findClass方法。
11:代理:代理类的每一个方法都调用目标类的方法,再加上一些系统功能的代码。
       面向方面编程:有很多的方法,这些方法中有一些相同的内容,即交叉业务,这些内容可以看做是这些方法的一个面。
12:创建动态代理类:调用类Proxy中的静态方法getProxyClass(ClassLoader loader,Class<?>... interface);
这个方法的第一个参数可以使任意的类加载器,第二个参数必须是一个接口的Class对象。
public static void main(String[] args) throws Exception {
  Class clazz=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  得到动态代理类的Class对象。
  System.out.println(clazz);
  Constructor[] constructors=clazz.getConstructors();
  for(Constructor constructor:constructors)
  {
   System.out.println(constructor);   遍历该类中的所有构造函数。
  }
  Method[] methods=clazz.getMethods();
  for(Method method:methods)
  {
   System.out.println(method);   遍历该类中的所有方法。
  }
 }
13:Class类中的newInstance()方法可以创建这个字节码文件的对象,但是只会调用该类的空参数构造方法。如果这个类没有空参数的构造方法,则会创建失败。

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

 详细请查看:http://edu.csdn.net/heima/

原创粉丝点击