内省àjavaBean
IntroSpector检查视察
对javaBean进行操作
javaBean是一个特殊的java类,方法和名称有特定的规则
intgetAge() void setAge(int a)
如果第二个字母是些小的,那么整个变量都是小写的
getAge()àage
getageàage
getAGE()àAGE
的那个javaBean能带来一些好处
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称之为值对象(Value Objectm,简称VO)
内省综合案例
如果用没有规定的方法,则需要通过反射完成,先得到x的表达式,比如
getX 拿到对象的Class 得到MethodgetX
PropertyDescriptorpd = new propertyDescriptor() 描述类
属性名,Class<?> beanClass 将那个类作为beanClass来看
PropertyDescriptor对象中有getReadMethod,getWriteMethod方法
只读,只写,可读写
思路
如果有传入对象
创建PropertyDescriptor对象,传入要查找的成员名称和beanclass的字节码对象Class
通过PropertyDescriptor的get,set方法获取Method方法,并用Object接受method方法的invoke方法调用此方法
Invoke方法要获取对象实体
反射
用三种方式获取Class对象,得到构造函数,或者用空参构造函数并调用newInstance方法获取实体,用Class的getmethod方法获取指定成员的指定方法
并用invoke调用
getProperty自定义名字,得到参数
采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的x属性
IntroSpector.getBeanInfoIntroSpector类有个静态方法,当做javaBean的结果信息
返回BeanInfo类,BeanInfo类就是描述BeanClass的细节
描述属性的类的获得
PropertyDescriptor可以通过构造函数传入参数名字和Class值来获得
也可以通过BeanInfo的getPropertyDescriptors来获得PropertyDecriptor的数组,BeanInfo则通过Introspector类的静态方法getBeanInfo传入Class来获得
BeanUtils
将jar包放入项目的lib文件夹下
右键build path—add to build path 增加到path中
将beanutils和logging放入到项目的lib目录中,然后右键buildpath将两个jar包导入到path路径中
BeanUtils.getProperty(pt1,”x”);获取值
BeanUtils.setProperty(pt1,”x”,1 )设置值
获取的值是String的类型
用内省的方式获取x的值,因为用Object接受的,所以getClass得到的是Integer对象,如果用Object接受一个int类型的数,那么就自动装箱成Integer
BeanUtils工具自动将我们要得到的数据转换成String类型
BeanUtils.setProperty(pt1, "birthday.setTime","111");
设置pt1对象中的birthday属性的对象的setTime方法,刚开始空指针异常是因为birthday属性没有指向对象,birthday是个Date类,所以new一个Date就可以设置值
因为Date对象中有setTime和getTime方法,所有可以作为beancalss对象来看待
支持属性的级联操作
Java提供的几个基本注解
@SuppressWarinings的应用让大家直观了解注解
1.5以后的新特性 枚举 注解
编译的时候输入参数-Xlint,查看哪里过时了
@SuppressWarinings(“deprecation”)不提示过时
一个注解是一个类
在这里用注解相当于创建了一个注解的实例对象
@Deprecated将方法声明为过时
比较的时候往往会传入本类类名,那么equals就会调用到了Object的equals方法
一个类中有一个方法run() 传入父类的对象,如果这个类的子类中也有个run(),但是传入的是那个父类对象的子类对象,那么这个方法不是覆盖是重载???
@Override 说明下面的方法要覆盖父类的方法
总结:注解相当于一种标记,在程序中加了注解就等于加上了某种标记,没加则等于没有某种标记,以后,javac编译器,开发工具和其它程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干相应的事,标价可以加载包,类,字段,方法的参数以及局部变量上
注解---注解类---应用了“注解类”的类---对“应用了注解类的类”进行反射操作的类
接口前面加上@符号
@interfaceA{}
创建类的时候,就会检查类上面是否有注解
Other里面 java视图中就直接有annotation
对一个类进行检查,获取本类的字节码对象
.class.isAnnotationPresent(ItcastAnooj.clss)这个注解类在不在
检查在不在,如果在的话就返回true
ItcastAnnotationannotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class)
进入条件 ,如果注解存在 那么得到这个注解
因为不知道是什么注解,所以要强转
加了@就创建了一个注解的对象
没有这个注解对象
@Retention(RetentionPolicy.RUNTIME)
注解的注解,这个注解是给元解类使用的
原注解
信息的信息就是元信息
再运行就可能打印,
@Retentionjavac把文件编译成class,可能将一些元文件注解去掉
假如保留了注解,加载的时候,类加载其会对class文件进行转换,可能将class文件中的注解信息不保留
Java源文件—class文件---内存中的字节码
三个地方都可能去掉注解
用RetetionPolicy指名注解的生命周期,SOURCERetetionPolicy.CLASS RetetionPolicy.RUNTIME
@Overrride的声明周期就在源代码阶段,编译完了就没用了
@suppreWamingsource编译器看的过时 编译器检查是否有,二进制 运行期间
@deprecated检查二进制
@Target(ElementsType.METHOD)
只用用在Method上
@Target({ElementsType.METHOD,ElementsType.TYPE})
TYPE表明class上面也可以用
Class的一个接口Type
Type比Class更加精准,interface enum这些都不是Class,但是都是同一类型,用type更加准确
@retention @target都是注解的注解 一个是生命周期,一个是使用范围
为注解增加基本属性
一个注解相当于一个胸牌,如果是哪个班还要增加属性
定义基本类型的属性和应用属性
在注解类中增加Stringcolor()
然后在使用的时候
@MyAnnotation(color=”red”)
用反射方式获得注解对应的实例对象用,再通过该对象调用属性对应的方法
MyAnnotationa = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class)
Deprecation 这个属性比较特殊
如果只有value属性需要设置,那么value可以省略
将color() default“blue”默认为blue,就不需要设置了
为注解增加高级属性
数组类型
Int[]arrayAttr()default{1,2,3}
@Myannotation(arrayAttr={2,3,4})
枚举类型
EnumTest.TrafficLamplamp()
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotationannotationAttr()default@MetaAnnotation(“XXX”)
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”))
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima