首页 > 代码库 > 反射笔记
反射笔记
1. getFields()和getDeclaredFields()的区别
getFields()和getDeclaredFields()返回Field对象,通过field.getName()获取名称。
getFields()只能获取声明为public的字段,包括父类的。
getDeclaredFields()能获取声明的所有字段,包括public,protected,private。
2. 转载
关键字:内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性 内省IntroSpectorJavaBean主要用于传递数据信息,其方法用于访问私有变量,且方法名符合某种规则。 如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。 内省主要是对JavaBean进行操作。JavaBean内部的方法要按照某种规则命名,例如void setAge(int age)、int getAge()。JavaBean可以作为普通类进行操作;普通类如果内部有set()、get()方法,也可以当做JavaBean使用。 JavaBean的属性是通过get()和set()方法推断出来的,即去掉get、set后的字母,例如,属性为age,而不是成员变量,因为成员变量看不见。获得属性名的规则:如果属性名的第二个字母是小写,则把第一个字母小写。例如,gettime—>time,setTime—>time,getCPU—>CPU。 JavaBean处理的好处: 1、JavaEE中许多地方需要使用JavaBean。 2、JDK给JavaBean提供的API称为内省。 PropertyDescriptor类 PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法: 1、getPropertyType(),获得属性的Class对象。 2、getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法。 3、hashCode(),获取对象的哈希值。 4、setReadMethod(Method readMethod),设置用于读取属性值的方法;setWriteMethod(Method writeMethod),设置用于写入属性值的方法; 导包java.bean.*; 通过属性名获取对应的值,利用反射方法,如下: ReflectPoint pt1 = new ReflectPoint(7,9); String propertyName = "x";//给一个属性,获取值 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodGetX = pd.getReadMethod();//Read对应get()方法 Object reValue = http://www.mamicode.com/methodGetX.invoke(pt1);"y";//给一个属性,设置值 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2,pt1.getClass()); Method methodSetY = pd2.getWriteMethod();//Write对应set()方法 methodSetY.invoke(pt1,3); 右键—》Source—》Generate Geters and Setters,创建get()和set()方法。 选择一些代码,右键—》Refactor—》Extract Method,创建一个方法,提高复用性。 Introspector类 将JavaBean中的属性封装起来进行操作。在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息。需要导包java.beans.*。 getPropertyDescriptors(),获得属性的描述,可以采用遍历BeanInfo的方法,来查找、设置类的属性。 private static Object getProperty_2(Object pt1, String propertyName) throws Exception { BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object reValue = http://www.mamicode.com/null;"x"),返回字符串 设置属性的值,例如,BeanUtils.setProperty(pt1,"y",22),参数是字符串或基本类型自动包装。设置属性的值是字符串,获得的值也是字符串,不是基本类型。 BeanUtils的特点:1、对基本数据类型的属性的操作:在WEB开发、使用中,录入和显示时,值会被转换成字符串,但底层运算用的是基本类型,这些类型转到动作由BeanUtils自动完成。2、对引用数据类型的属性的操作:首先在类中必须有对象,不能是null,例如,private Date birthday=new Date();。操作的是对象的属性而不是整个对象,例如,BeanUtils.setProperty(pt1,"birthday.time",121);Java7的新特性:Map和JavaBean之间可以进行相互转换,key是属性,value是值。describe:JavaBean—>Map;populate:Map—>JavaBean。例如: Map map = (name:Kim,age:18); BeanUtils.setProperty(map,"name","Kim"); copyProperties(Object dest, Object orig) ,将一个对象的属性值复制到另一个对象的属性,需要保证属性一致。 PropertyUtils类 和BeanUtils不同在于,运行getProperty、setProperty操作时,没有类型转换,使用属性的原有类型或者包装类。 注解Annotation JDK1.5出现的新特性。在java.lang.annotation包中。 对于过时的语句,java会提示过时了,通过@SuppressWarnings("Deprecation")在DOS中取消提示,但Eclipse无法取消。这就是注解,相当于标记。编译器、开发工具、javac通过反射获得注解里的内容,进而明确应该做什么、不应该做什么。注解可以加在包、类、属性、方法、参数及局部变量之上。 一个注解就是一个类。@SuppressWarnings,取消警告。@Deprecated,已过时,老版可以用,新版无法用。 HashSet集合中,对象必须覆盖Object类的equals()方法,否则会继续使用Object类的equals()方法进行比较,错误的比较方法。覆盖equals()方法,参数必须一致,为了防止错误写入本类的对象,加入@Override,必须正确覆盖父类方法,不是创建新方法。 注解的应用 在源程序中,调用一个类,这个类会用到注解,需要先准备好注解类,类在调用注解类的对象。注解类的写法类似接口,@interface。先写好注解类A,将注解放在类B中,类C在调用类B时通过反射获得注解类A的内容,进而明确该做什么、不该做什么。可以加上多个注解,加上的实际是注解类的对象:@interfaceA。 main()方法必须放在一个类下,但与这个类不一定有所属关系。 在注解类A上加注解B,这个注解B只为这个注解类A服务,B称为“元注解”。类似的还有元信息、元数据。元注解有2个:Rentention和Target。对注解类的注解,可以理解为注解类的属性。 Rentention注解类 注解的生命周期:Java源文件—》class文件—》内存中的字节码。编译或者运行时,都有可能会取消注解。Rentention的3种取值意味让注解保留到哪个阶段,RententionPolicy.SOURCE、RententionPolicy.CLASS(默认值)、RententionPolicy.RUNTIME。 @Override、@SuppressWarnings是默认保留到SOURCE阶段;@Deprecated是保留到RUNTIME阶段。 Rentention相当于注解类的一个属性,因为Rentention的值不同,注解类保留到的阶段不同。注解类内部Rentention的值使用value表示,例如,@Deprecated中,value=http://www.mamicode.com/Runtime。"black"),给属性赋值,取值时类似调用方法,例如,System.out.println(annotation.color());。所有的属性必须全部出现,除非有缺省值。如果只有value属性,没有其他属性,可以不写=,只针对value,例如,@SuppressWarnings("Deprecation")。或者有其他属性而且有缺省值,例如,String color() default "blue";,此时value单独出现,不用=。获得注解的属性的值,例如if(AnnotationDemo.class.isAnnotationPresent(ItcastAnnotation.class)){ ItcastAnnotation annotation = (ItcastAnnotation)AnnotationDemo.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.color()); }}利用反射获得注解的对象,在让该对象调用属性对应的方法。注意类型转换。Rentention和Target也是属性,都是value对应的值,值的类型分别是RententionPolicy和ElementType,例如,@Retention(value=http://www.mamicode.com/RetentionPolicy.RUNTIME)。"Jobs")@ItcastAnnotation(annotationAtt=@MetaAnnotation("Kim"))annotation.annotationAtt().value()注解的返回值可以是8个基本类型、String、Class、枚举以及前面类型的数组,内部还有属性。需要详细学习注解,可以通过java语言规范,即languagespecification。
反射笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。