黑马程序员——【Java高新技术】——JavaBean、注解
2014-10-08 23:37
246 查看
---------- android培训、java培训、期待与您交流! ----------
一、JavaBean
* 通过内省引入JavaBean:内省对应的英文全程是IntroSpector。在Java中,其作用主要针对JavaBean进行操作。
(一)概述
(1)JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法符合某种特殊的命名规则。
(2)如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)
(3)JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。
如方法名为setId,则中文意思是设置Id,getId也是如此;去掉set或者get前缀,剩余部分就是属性名称。如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:
Ø getAge/setAge-->age;
Ø gettime-->time;
Ø setTime-->time;
Ø getCPU-->CPU;
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
(二)JavaBean好处
符合JavaBean特点的类可以当作普通类一样使用,把它当JavaBean用会带来一些额外的好处:
1、在Java EE开发中,经常要使用到JavaBean,很多环境就要求按JavaBean方式进行操作。
2、JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。用内省这套api操作JavaBean比用普通类的方式更方便。
(三)内省的简单操作
(四)对JavaBean的复杂内省操作
1、操作步骤:
(1)在IntroSpector类中有getBeanInfo(Class cls)的方法,通过此方法获取BeanInfo实例。参数是相应对象的字节码,即Class对象。
(2)BeanInfo类中有getPropertyDescriptors()的方法,可获取所有的JavaBean类中的属性信息,返回一个PropertyDescriptor[]。
(3)在通过遍历的形式,获取与想要的那个属性信息。
2、以getX为例,步骤实现的代码示例:
(五)BeanUtils工具包
1、beanutils包下载及添加
(1)下载地址:http://commons.apache.org/proper/commons-beanutils/
(2)两种添加方式:
Ø 方式1:项目上“右键”—— Build Path —— Configure Build Path —— 选择Liberiers标签 —— AddExternal Jars —— 选择要导入的jar包。这种方式属于“本地添加”,存在的问题就是如果jar路径发生变化,项目就不能使用到这个jar包。
Ø 方式2:在项目中建立一个lib目录,专门用于存放项目所使用到的jar工具包。将要使用到jar包复制进来。在Eclipse的Package Explorer面板中,在jar文件上点右键——选择Builder Path——Add to BiuldPath,添加完成。这样做的好处:jar随项目一起移动。
2、可能出现的问题
问题:添加beanutils工具包后,可能会出现org/apache/commons/logging/logFactory找不到
解决方法:下载commons-logging.jar,同beanutils添加步骤一样,添加日志jar包即可。
3、BeanUtils工具应用,代码示例
4、BeanUtils和PropertyUtils的区别?
BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。区别在于:
(1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String。
(2)PropertyUtils以属性本身的类型进行操作。
=============================Annotation(注解)==============================
二、注解(Annotation)
(一)概述
1、注解(Annotation)相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。
2、标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
3、格式:@ 注解名称
(二)Java提供的几个基本注解
1、@Deprecated:表示告知调用者,该成员函数、字段等已经过时,不再推荐使用。
(1)让程序部提示函数弃用(过时)?需要在main方法前面,写上@Suppress Warings(“deprecation”)
(2)注解一个函数过时?在函数的上一行,写上@deprecated
2、@Override:表示覆盖父类方法。
(三)注解的应用结构图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/16/8aca8f6ae5092d1dcf8ce0af487bee67.jpg)
(四)自定义注解及其应用
1、格式:@interface name{statement},如public @interface MyAnnotation{}
2、在类上添加注解:
@MyAnnotation
public class AnnotationTest{}
3、元注解(@Retention、@Target)
Ø Retetion:用于说明注解保留在哪个阶段(即注解的生命周期)。一个注解的生命周期包括:java源文件→class文件→内存中的字节码[雨林木风1] ,其有三种取值:
(1)RetetionPolicy.SOURSE:java源文件时期,如@Overried和@SuppressWarning
(2)RetetionPolicy.CLASS: class文件时期(默认阶段)
(3)RetetionPolicy.RUNTIME:运行时期,如@Deprecated
如:在某注解类上加@Retention(RetentionPolicy.RUNTIME),表示此注解会一直存在。
Ø Target:用于说明注解类的使用范围(如:作用在方法上、类上,默认值是任何地方)
其值可设置为枚举类ElementType类中的任何一个,包括:包、字段、方法、方法参数、构造器、类等值。取值为:
ANNOTATION_TYPE:注释类型声明;
CONSIRUCTOR:构造器声明;
FIELD:字段声明;
LOCAL_VARIABLE:局部变量声明;
METHOD:方法声明;
PACKAGE:包声明;
PARAMETER:参数声明;
TYPE:类、接口(包含注释类型)或枚举声明;
注意:其中代表类的值是TYPE。因为class、enum、interface和@interface等都是平级的,所以统属于Type。不可用CLASS表示。
4、注解代码示例
(五)为注解增加基本属性
1、注解属性:为注解的参数添加的属性。例如:@MyAnnotation(color="red")
2、定义基本类型的属性
(1)在注解类中增加属性:String color();
(2)定义缺省格式:String value() default “heima;
3、注解属性应用:
直接在注解的括号中添加自身的属性:@MyAnnotation(color="red")
4、value属性:如果注解中有一个名称为value的属性,且只想设置value属性(即其他属性都采用默认值或只有一个value属性),那么可以省略value=部分。例如:
String value() default "red";
@MyAnnotation("green")
5、说明:
(1)可以为属性值指定缺省值(default),应用时同样可以重新设置属性值。
(2)用反射方式获得注解对应的实例对象后,可以通过该对象调用属性对应的方法来获取属性值。
6、代码示例:
(六)为注解增加高级属性
1、数组类型的属性:
如:int[]arrayArr() default {1,2,3}
应用:@MyAnnotation(arrayArr={2,3,4})
注:如果数组属性中只有一个元素,这时候属性值部分可以省略大括。
2、枚举类型的属性:(定义了一个枚举类TrafficLamp,它是EnumTest的内部类,其值是交通灯的三色)
定义:EnumTest.TrafficLamplamp();
应用:@MyAnnotation(lamp=EnumTestTrafficLamp.GREEN)
3、注解类型的属性:(定义一个注解类:MetaAnnotation,其中定义了一个属性:String value())
定义:MetaAnnotation annotation() default @MetaAnnotation(”xxx”);
应用:@MyAnnotation(annotation=@MetaAnnotation(”yyy”))//重新赋值
4、Class类型的属性:
定义:Class cls();
应用:@MyAnnotation(cls=AnnotationDemo.class)
注:这里的.class必须是已定义的类,或是已有的字节码对象
5、注解的详细语法可通过查看java语言规范了解即javaLanguage Specification
6、代码示例:
---------- android培训、java培训、期待与您交流! ----------
一、JavaBean
* 通过内省引入JavaBean:内省对应的英文全程是IntroSpector。在Java中,其作用主要针对JavaBean进行操作。
(一)概述
(1)JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法符合某种特殊的命名规则。
(2)如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)
(3)JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。
如方法名为setId,则中文意思是设置Id,getId也是如此;去掉set或者get前缀,剩余部分就是属性名称。如果剩余部分的第二个字母小写,则把剩余部分改为小写。如:
Ø getAge/setAge-->age;
Ø gettime-->time;
Ø setTime-->time;
Ø getCPU-->CPU;
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
(二)JavaBean好处
符合JavaBean特点的类可以当作普通类一样使用,把它当JavaBean用会带来一些额外的好处:
1、在Java EE开发中,经常要使用到JavaBean,很多环境就要求按JavaBean方式进行操作。
2、JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。用内省这套api操作JavaBean比用普通类的方式更方便。
(三)内省的简单操作
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; public class IntroSpectorTest { public static void main(String[] args) throws Exception { ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; Object retVal = getProperty(pt1, propertyName); Object value = 7; setProperties(pt1, propertyName, value); System.out.println(pt1.getX()); } private static void setProperties(Object pt1, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodSetX = pd2.getWriteMethod(); methodSetX.invoke(pt1,value); } private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodGetX = pd.getReadMethod(); Object retVal = methodGetX.invoke(pt1); return retVal; } }
(四)对JavaBean的复杂内省操作
1、操作步骤:
(1)在IntroSpector类中有getBeanInfo(Class cls)的方法,通过此方法获取BeanInfo实例。参数是相应对象的字节码,即Class对象。
(2)BeanInfo类中有getPropertyDescriptors()的方法,可获取所有的JavaBean类中的属性信息,返回一个PropertyDescriptor[]。
(3)在通过遍历的形式,获取与想要的那个属性信息。
2、以getX为例,步骤实现的代码示例:
private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)) { Method methodGetX = pd.getReadMethod(); retVal = methodGetX.invoke(pt1); break; } } return retVal; }
(五)BeanUtils工具包
1、beanutils包下载及添加
(1)下载地址:http://commons.apache.org/proper/commons-beanutils/
(2)两种添加方式:
Ø 方式1:项目上“右键”—— Build Path —— Configure Build Path —— 选择Liberiers标签 —— AddExternal Jars —— 选择要导入的jar包。这种方式属于“本地添加”,存在的问题就是如果jar路径发生变化,项目就不能使用到这个jar包。
Ø 方式2:在项目中建立一个lib目录,专门用于存放项目所使用到的jar工具包。将要使用到jar包复制进来。在Eclipse的Package Explorer面板中,在jar文件上点右键——选择Builder Path——Add to BiuldPath,添加完成。这样做的好处:jar随项目一起移动。
2、可能出现的问题
问题:添加beanutils工具包后,可能会出现org/apache/commons/logging/logFactory找不到
解决方法:下载commons-logging.jar,同beanutils添加步骤一样,添加日志jar包即可。
3、BeanUtils工具应用,代码示例
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; public class IntroSpectorDemo { public static void main(String[] args) throws Exception { reflectPoint rp1 = new reflectPoint(3,5); String propertyName = "x"; // 用BeanUtils工具包的方法 System.out.println(BeanUtils.getProperty(rp1, "x"));//get BeanUtils.setProperty(rp1, "x", "9");//set System.out.println(rp1.getX()); } }
4、BeanUtils和PropertyUtils的区别?
BeanUtils工具包中还有一个工具类PropertyUtils,用法跟BeanUtils一样。区别在于:
(1)BeanUtils会对JavaBean的属性的类型进行转换,如属性本身是integer,会转换为String。
(2)PropertyUtils以属性本身的类型进行操作。
//用BeanUtils工具包的工具类BeanUtils方法 BeanUtils.setProperty(rp1, "x", "9");//set,9是String System.out.println(BeanUtils.getProperty(rp1, "x"));//get System.out.println(BeanUtils.getProperty(rp1, "x").getClass().getName());//java.lang.String //BeanUtils工具包中的PropertyUtils的操作 PropertyUtils.setProperty(rp1, "x", 9);//9是Integer System.out.println(PropertyUtils.getProperty(rp1, "x")); System.out.println(PropertyUtils.getProperty(rp1,"x").getClass().getName());//java.lang.Integer
=============================Annotation(注解)==============================
二、注解(Annotation)
(一)概述
1、注解(Annotation)相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。
2、标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
3、格式:@ 注解名称
(二)Java提供的几个基本注解
1、@Deprecated:表示告知调用者,该成员函数、字段等已经过时,不再推荐使用。
(1)让程序部提示函数弃用(过时)?需要在main方法前面,写上@Suppress Warings(“deprecation”)
(2)注解一个函数过时?在函数的上一行,写上@deprecated
2、@Override:表示覆盖父类方法。
(三)注解的应用结构图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/16/8aca8f6ae5092d1dcf8ce0af487bee67.jpg)
(四)自定义注解及其应用
1、格式:@interface name{statement},如public @interface MyAnnotation{}
2、在类上添加注解:
@MyAnnotation
public class AnnotationTest{}
3、元注解(@Retention、@Target)
Ø Retetion:用于说明注解保留在哪个阶段(即注解的生命周期)。一个注解的生命周期包括:java源文件→class文件→内存中的字节码[雨林木风1] ,其有三种取值:
(1)RetetionPolicy.SOURSE:java源文件时期,如@Overried和@SuppressWarning
(2)RetetionPolicy.CLASS: class文件时期(默认阶段)
(3)RetetionPolicy.RUNTIME:运行时期,如@Deprecated
如:在某注解类上加@Retention(RetentionPolicy.RUNTIME),表示此注解会一直存在。
Ø Target:用于说明注解类的使用范围(如:作用在方法上、类上,默认值是任何地方)
其值可设置为枚举类ElementType类中的任何一个,包括:包、字段、方法、方法参数、构造器、类等值。取值为:
ANNOTATION_TYPE:注释类型声明;
CONSIRUCTOR:构造器声明;
FIELD:字段声明;
LOCAL_VARIABLE:局部变量声明;
METHOD:方法声明;
PACKAGE:包声明;
PARAMETER:参数声明;
TYPE:类、接口(包含注释类型)或枚举声明;
注意:其中代表类的值是TYPE。因为class、enum、interface和@interface等都是平级的,所以统属于Type。不可用CLASS表示。
4、注解代码示例
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) //注解类 @interface MyAnnotation { } @MyAnnotation public class AnnotationDemo { @SuppressWarnings("deprecation")//此注解用于表明不提示过时信息 public static void main(String[] args) { System.runFinalizersOnExit(true); //此方法已过时 //判断此类是否有MyAnnotation注解 if (AnnotationDemo.class.isAnnotationPresent(MyAnnotation.class)) { //如果有,则获取该注解 MyAnnotation annotation = AnnotationDemo.class.getAnnotation(MyAnnotation.class); System.out.println(annotation); } } }
(五)为注解增加基本属性
1、注解属性:为注解的参数添加的属性。例如:@MyAnnotation(color="red")
2、定义基本类型的属性
(1)在注解类中增加属性:String color();
(2)定义缺省格式:String value() default “heima;
3、注解属性应用:
直接在注解的括号中添加自身的属性:@MyAnnotation(color="red")
4、value属性:如果注解中有一个名称为value的属性,且只想设置value属性(即其他属性都采用默认值或只有一个value属性),那么可以省略value=部分。例如:
String value() default "red";
@MyAnnotation("green")
5、说明:
(1)可以为属性值指定缺省值(default),应用时同样可以重新设置属性值。
(2)用反射方式获得注解对应的实例对象后,可以通过该对象调用属性对应的方法来获取属性值。
6、代码示例:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation{ String color() default "blue"; String value(); } @MyAnnotation(color="red",value="abc") public class AnnotationTest { @SuppressWarnings("deprecation") @MyAnnotation("xyz") public static void main(String[] args) throws Exception{ System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresentMyAnnotation.class)){ System.out.println(annotation.color()); System.out.println(annotation.value()); } } }
(六)为注解增加高级属性
1、数组类型的属性:
如:int[]arrayArr() default {1,2,3}
应用:@MyAnnotation(arrayArr={2,3,4})
注:如果数组属性中只有一个元素,这时候属性值部分可以省略大括。
2、枚举类型的属性:(定义了一个枚举类TrafficLamp,它是EnumTest的内部类,其值是交通灯的三色)
定义:EnumTest.TrafficLamplamp();
应用:@MyAnnotation(lamp=EnumTestTrafficLamp.GREEN)
3、注解类型的属性:(定义一个注解类:MetaAnnotation,其中定义了一个属性:String value())
定义:MetaAnnotation annotation() default @MetaAnnotation(”xxx”);
应用:@MyAnnotation(annotation=@MetaAnnotation(”yyy”))//重新赋值
4、Class类型的属性:
定义:Class cls();
应用:@MyAnnotation(cls=AnnotationDemo.class)
注:这里的.class必须是已定义的类,或是已有的字节码对象
5、注解的详细语法可通过查看java语言规范了解即javaLanguage Specification
6、代码示例:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)//元注释 @Target({ElementType.METHOD,ElementType.TYPE})//元注解,指定使用范围 //注解类 public @interface MyAnnotation { String color() default "red" ; String value(); int[] arr() default {1,2,3}; EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.GREEN; MetaAnnotation annotation() default @MetaAnnotation("heima"); Class clazz() default System.class; } //注解类的应用,给属性赋值或者重新赋值 @MyAnnotation(lamp=EnumTest.TrafficLamp.YELLOW,value="itheima", clazz=AnnotationDemo.class,annotation=@MetaAnnotation("itheima")) public class AnnotationDemo { @SuppressWarnings("deprecation") @MyAnnotation("Method")//自定义注解应用在方法上 public static void main(String[] args) throws NoSuchMethodException, SecurityException { System.runFinalizersOnExit(true); //一个过时方法 //判断此类是否有MyAnnotation注解 if (AnnotationDemo.class.isAnnotationPresent(MyAnnotation.class)) { //如果有,则获取该注解 MyAnnotation annotation =AnnotationDemo.class.getAnnotation (MyAnnotation.class); System.out.println(annotation);//@cn.itheima.Demo.MyAnnotation() System.out.println(annotation.color()); System.out.println(annotation.value()); System.out.println(annotation.arr().length); System.out.println(annotation.lamp()); System.out.println(annotation.annotation().value()); System.out.println(annotation.clazz()); } //获取方法上的注解 Method mainMethod = AnnotationDemo.class.getMethod("main",String[].class); MyAnnotation annotationMethod = (MyAnnotation) mainMethod.getAnnotation (MetaAnnotation.class); SuppressWarnings sw=mainMethod.getAnnotation(SuppressWarnings.class); System.out.println(sw); System.out.println(annotationMethod); } }
---------- android培训、java培训、期待与您交流! ----------
相关文章推荐
- 黑马程序员——Java高新技术——内省JavaBean及BeanUtils的应用、注解等
- 黑马程序员-Java基础总结16——高新技术Day02(JavaBean、注解与泛型)
- 黑马程序员 java_高新技术(三)_内省 JavaBean 注解
- 黑马程序员_Java高新技术三_javabean、注解的应用
- 【黑马程序员】张孝祥Java高新技术_内省、注解、泛型
- 黑马程序员_java高新技术(2)注解、泛型、类加载器
- 黑马程序员-Java高新技术之JavaBean、注解和泛型
- 黑马程序员---java高新技术一之注解
- 黑马程序员 Java高新技术---注解
- 黑马程序员_高新技术之javaBean,注解,类加载器
- 黑马程序员__JAVA高新技术--枚举及内省JavaBean、可变参数等知识点总结
- 黑马程序员 java高新技术之注解,泛型,类加载器
- 黑马程序员 Java高新技术 注解,泛型
- 黑马程序员---java高新技术之注解
- 黑马程序员_java高新技术之注解
- 黑马程序员——高新技术(javabean 注解 泛型 )
- 黑马程序员_Java高新技术——内省,注解
- 2010年Java高新技术A(3)内省 JavaBean 注解
- 黑马程序员--java高新技术 26--javaBean,泛型,类加载器,代理spring小框架
- 黑马程序员_高新技术二(java内省注解泛型)