一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,修饰符,包等等信息也用一个个的Java类来表示。
可以使用getField来获取类的可见的成员变量,对于不可见的也就是有private修饰的必须使用getDeclaredField来获取。要获取类的方法就必须使用getMethod方法,参数包括方法的名字和方法的参数的类。所得到的Method使用invoke方法来调用。在jdk1.4和jdk1.5的invoke方法是有区别的,例如System.out.println( charAt.invoke("abcd", new Object[]{1}));,当我们将一个数组作为参数传递给invoke方法时,按jdk1.4的语法,数组中的每个元素对应一个参数,按jdk1.5的语法,整个数组是一个参数。这显然是有些矛盾的,但是经过反复的推敲可以知道,Class.getMethod方法的时候接受什么样的参数。Class.getMethod(name,Class... args)中的参数列表的args部分还是有一点困惑,它代表所要获取的那个方法的各个参数的类型的列表。
Method.invoke()接受的参数,如果一个参数为null,这意味着什么呢,这其实意味着这个方法是一个静态方法。mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
这之后张老师又给我们复习了集合的知识,在我以前看书的就对集合这一块比较陌生。collection只是一个接口,在使用的时候我们必须使用实现了该接口的集合类,比如ArrayList,hashSet等,首先要区分下这两种类型的不同。collection对象之间没有指定顺序,允许有重复的元素。Set对象之间没有指定的顺序,但是不允许有重复的元素。List指定了元素的顺序,但是允许有重复的元素。
一个类加载器能加载.class文件,那它当然也能加载classpath环境下的其他文件。可以使用Reflect.class.getClassLoader()来启用类加载器。通过使用getResourceAsStream来加载其他的文件。内省:首先介绍JavaBean,一个JavaBean就是其中的方法符合某种命名规则的一个java类,JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。在Java EE开发中,经常要使用到JavaBean,JDK中提供了对JavaBean进行操作的一些API。一个JavaBean类可以不当JavaBean用,而可以当普通类用。那我会什么要把它当JavaBean用?这肯定与普通类的用法不一样!第一,别人都这么用,你就得这么用?第二,就是人家提供了一套针对javabean操作的api,用这套api比用普通类的方式更方便。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
beanutils与PropertyUtils工具的使用:PropertyUtils.getPropety方法获得的属性值的类型为该属性本来的类型,而BeanUtils.getProperty则是将该属性的值转换成字符串后才返回。
注解:通过java.lang包,了解JDK中提供的最基本的annotation;@Deprecated,@SuppressWarnings和@Override三种注解,张老师都给我们讲解了,看的很明白,就是这些单词很陌生,看来还是要经过长期的联系才可以啊,最终达到熟能生巧。
接下来总结下如何自己来定义注解。了注解,等于打上了某种标记,没加,则等于没有某种标记,以后,其他程序可以用反射来了解你的类上面有无何种标记,看你有什么标记,就去干相应的事。标记可以加在类,方法,字段,包上,方法的参数上。定义注解就是使用public @interface 来定义的。在定义的时候,需要给定义注解的语句前面使用注解。引出@Retention注解,它的值有三种RetetionPolicy.SOURCE,RetetionPolicy.CLASS,RetetionPolicy.RUNTIME;分别是源代码级,字节码文件级,运行级。
注解@Target,Target的默认值为任何元素,用数组方式设置如下{ElementType.METHOD,ElementType.TYPE}。