一、JavaBean和内省 IntroSpector
1.JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则,其中的方法名称,都符合特殊的规则。只要一个类中含get和set打头的方法,就可以将其当做JavaBean使用。当一个类被当做JavaBean使用时,JavaBean属性是根据方法名来进行推断的,根本看不到内部的成员。
2.内省 JDK中提供了对JavaBean进行操作的API,这套API称为内省,若要自己通过getX的方式来访问私有x。
3.我们要对JavaBean进行操作的话要推断出它的成员。
因为JavaBean中都是setX、getX方法,所以如果第一个单词时大写的我们就把大写的字母改成小写:例如:getName--àname
如果第一个单词不是大写的就不用改了。
如果都是大写的也不用改了。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
BeanUtils的好处:
1.提供的set或get方法中,传入的是字符串,返回的还是字符串,因为在浏览器中,用户输入到文本框的都是以字符串的形式发送至服务器上的,所以操作的都是字符串。
也就是说这个工具包的内部有自动将整数转换为字符串的操作。
2.支持属性的级联操作,即支持属性链。如可以设置:人的脑袋上的眼镜的眼珠的颜色。这种级联属性的属性连如果自己用反射,那就很困难了,通过这个工具包就可以轻松调用。
PropertyUtils类先get原来设置好的属性,再将其set为一个新值。
get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。
publicstatic void main(String[]args) throws Exception{
//应该先直接用ArrayList和HashSet,然后才引入从配置文件读
Properties props =newProperties();
//先演示相对路径的问题
//InputStream ips = new FileInputStream("config.properties");
/*一个类加载器能加载.class文件,那它当然也能加载classpath环境下的其他文件,既然它有如此能力,它没有理由不顺带提供这样一个方法。它也只能加载classpath环境下的那些文件。注意:直接使用类加载器时,不能以/打头。*/
//InputStream ips =ReflectTest2.class.getClassLoader().getResourceAsStream("cn/itcast/javaenhance/config.properties");
//Class提供了一个便利方法,用加载当前类的那个类加载器去加载相同包目录下的文件
//InputStream ips =ReflectTest2.class.getResourceAsStream("config.properties");
InputStream ips = ReflectTest2.class.getResourceAsStream("/cn/itcast/javaenhance/config.properties");
props.load(ips);
Ips.close();
二、注解
1.概述:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记
标记可以加在包、类、字段、方法、方法参数,以及局部变量上等等。
格式:@注解类名()。如果有属性,则在括号中加上属性名(可省略)和属性值。
2.java中三种最基本的注解:
@SuppressWarning(”deprecation”) //用于提示编译时的警告源程序
@Deprecated //是用于提示方法已过时运行时
假定之前的某个类升级了,其中的某个方法已经过时了,不能够将过时的方法删除,@Override //提示覆盖父类方法源程序看的
可对自己类中的方法判断是否是正确的覆盖了父类的方法
3.注释的应用
1、定义格式:@interface名称{statement}
2、判断一个类中是否加注解了:用这个isAnnotationPresent();方法
例如:AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class);
3、注解的生命周期:Java源文件àclass文件-à内存中的字节码
4、获得这个注解:用getAnnotation()这个方法
例如:ItcastAnnotationannotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
@Retention(RetentionPolicy.RUNTIME)//表示让它在运行阶段有
@Target(ElementType.METHOD,ElementType.TYPE)//表示把这个注解写到方法上,如果你想要在类上也可以,就写上ElementType.TYPE
public @interface ItcastAnnotation {
Stringcolor();
在注解类中增加String color();
@MyAnnotation(color="red")
String value();
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("r")。 String value() default "zxx";
int[] ArrayAttr();//数组类型的
EnumTest.TrafficLampLamp();default EnumTest. TrafficLamp.RDE//定义枚举类型的
MetaAnnotation annotationAttr()default @MetaAnnotation("gdgfd");
//定义一个注解类型的
}
注意:如果只有一个value属性需要设置,可以省略value。例如:@ ItcastAnnotation(“dsf”);
如果你想要省略value,可以把color设置成default。例如:
String color();default “red”;
为注解添加高级属性
l 数组类型的属性
Ø int [] arrayAttr()default{1,2,3};
Ø @MyAnnotation(arrayAttr={2,3,4})
Ø 如果数组属性中只有一个元素,这时候属性值部分可以省略大括
l 枚举类型的属性
Ø EnumTest.TrafficLamplamp() ;
Ø @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
l 注解类型的属性:
Ø MetaAnnotationannotationAttr()default @MetaAnnotation("xxxx");
Ø @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”))
Ø 可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotationma = myAnnotation.annotationAttr();
System.out.println(ma.value());
l 注解的详细语法可以通过看java语言规范了解,即看java的language specification。
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。