---------- 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:表示覆盖父类方法。

  (三)注解的应用结构图

  (四)自定义注解及其应用

  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、注解的更多相关文章

  1. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  2. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  3. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  4. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  5. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  6. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  7. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  8. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  9. 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流

    ------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...

  10. 黑马程序员——JAVA基础之多线程的安全问题

    ------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...

随机推荐

  1. Eclipse开发过程中个VM Arguments的设置

    Eclipse开发过程中个VM Arguments的设置 1:jre中的Default VM Arguments: -Xms256M -Xmx640M -XX:PermSize=256m -XX:Ma ...

  2. 登录锁定状态下Win7关机技巧总结

    登录锁定状态下Win7关机技巧总结 一般在锁定状态都是有个关闭电脑的图标的.但是如果你的系统没有,那么怎么样关机呢,所谓的锁定状态通常是指电脑在登录界面,具体的实现如下,感兴趣的朋友可以参考下 现在大 ...

  3. Sprint(第二天11.15)

    Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:点餐系统 4.团队博客地址:http://www.cnblogs.com/iamCarson/ 团 ...

  4. C#浅拷贝与深拷贝区别

    也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案 ...

  5. HTML 方法

    姓名输入框:<input type="text" value="默认有值"/> 密码输入框:<input type="text&qu ...

  6. 《BI项目笔记》创建时间维度(2)

    创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...

  7. HDU-4532 湫秋系列故事——安排座位 组合数学DP

    题意:有来自n个专业的学生,每个专业分别有ai个同学,现在要将这些学生排成一行,使得相邻的两个学生来自不同的专业,问有多少种不同的安排方案. 分析:首先将所有专业的学生视作一样的,最后再乘以各自学生的 ...

  8. SSH项目Class类的注解与属性的注解

    经过一段日子对SSH的学习,为了有利于随时能熟练的把一个SSH的项目快速的搭建起来,并且在报错的时候,将报错信息和解决 方案记录下来,每天一次的代码练习已成为家常便饭 所以,在反复练习的时候,发现Sp ...

  9. NGUI Scroll List

    NGUI Scroll List 1.Add GameObject with Script UI Panel(NGUI -> UI -> NGUI Panel) and Script UI ...

  10. SPSS数据分析—卡方检验

    t检验和方差分析主要针对于连续变量,秩和检验主要针对有序分类变量,而卡方检验主要针对无序分类变量(也可以用于连续变量,但需要做离散化处理),用途同样非常广泛,基于卡方统计量也衍生出来很多统计方法. 卡 ...