---------- 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. jquery中没有innerHTML

    本人正在学习使用jQuery. 发现如果我在div或者其他非表单的标签中赋值,原本用普通的js就直接document.getElementById("id").innerHtml( ...

  2. noi 4978 宠物小精灵之收服

    题目链接:http://noi.openjudge.cn/ch0206/4978/ 二维费用背包 在最后找还剩多少体力的时候,直接找到第二维,当结果 f[n][i] == f[n][m] 时,就说明已 ...

  3. openvpn之搭建配置

    一.openvpn原理 openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的.这种方式称为TLS加密 ...

  4. flex垂直居中

    最近遇到一个令我绞尽脑汁的布局 T.T.T.T,分享下.重点--垂直居中. 布局说明:1. 场次为一场比赛 2. 比赛双方是交战的两个队伍 3. 一场比赛可以有多种玩法,所以场的每个玩法的布局的高度都 ...

  5. signtool

    https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx C:\Users\Administrator\.nuget\packa ...

  6. How To Use FETCH_RECORDS In Oracle Forms

    When called from an On-Fetch trigger, initiates the default Form Builder processing for fetching rec ...

  7. Apache Solr 访问权限控制

    Current state of affairs SSL support was added in version 4.2 (SolrCloud v4.7). Protection of Zookee ...

  8. C# lock

    一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当 ...

  9. Xcode创建Object-C程序

    一. Xcode 环境安装 与 工程创建 1. 下载环境 相关资源下载 : -- IOS 相关资料下载页面 :  https://developer.apple.com/devcenter/ios/i ...

  10. 基础知识复习(二)——stdafx.h 头文件及x&(x-1)运算

    今天好久没写过C++程序了,使用VS2013 新建空的控制台程序,结果自动生成了头文件和main 方法. 就了解了stdafx.h头文件的含义及用法. stdafx:standard Applicat ...