JavaBean-内省-注解

javaBean 的概述

javaBean 是一种特殊的java类,主要用于传递信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

JavaBean的属性根据方法名得出

Age -->如果第二个字母是小写,则第一个字母变成小的—>age

gettime-->time

getTime-->time

getCPU--->CPU

javaBean 的内省操作:

public class IntroSpectorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
         ReflectPoint pt1 = new ReflectPoint(3,4);
         String propertyName = "x";
         //x-->X-->getX-->MethodGetX
         PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
//PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
         Method methodGetX =pd.getReadMethod();
         Object retVal =  methodGetX.invoke(pt1);
         System.out.println(retVal);
         
         Object retVal1=getProperty(pt1, propertyName);
         System.out.println(retVal1);
         
         Method methodSetX = pd.getWriteMethod();
         methodSetX.invoke(pt1, 7);
         System.out.println(pt1.getX());
         
         Object value = 9;
         setProperty(pt1, propertyName, value);
         System.out.println(pt1.getX());
         
      
	}
      	
	   private static void setProperty(Object pt1,String propertyName,Object value) throws InvocationTargetException{
		   PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass());
		   Method methodSetX = pd2.getWriteMethod();
		   methodSetX.invoke(pt1, value);
	   }
	   private static Object getProperty(Object pt1,String propertyName1) throws Exception{
	         BeanInfo beanInfo =Introspector.getBeanInfo(pt1.getClass());//javaBean来看这个类
/*
提供有关其 bean 的显式信息的 bean 实现者可以提供某个 BeanInfo 类,该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。

*/
	         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//得到属性描述
	         Object retValu =null;
	         for(PropertyDescriptor pd:pds){
	        	 if(pd.getName().equals(propertyName1)){
	        		 Method methodGet =pd.getReadMethod();
	        		 retValu = methodGet.invoke(pt1);
	        		 break;
	        		 
	        	 }
	        	
	         }
	         return retValu;
	       }

}

注解 JDK1.5新特性  annotation

注解就相当与一种标记,在程序中加了注解就等于为程序打上了某种标记,

以后javac编译器,开发工具和其他程序可以用反射来了解这个类及各种元素上有无何种标记,看有你又什么标记就去干相应的事。标记可以加在包,类,字段,方法的参数以及局部变量上。

1@SuppressWarning 取消显示指定的编译器警告

2@Deprecated 过时

3@Override 重载

注解的应用结果图:


  • 自定义注解及其应用

1、 定义最简单的注解

public @interface ItcastAnnotation {}

注:注解的属性以方法定义。

2、把它加到某个类上

@ItcastAnnotation//注解的一个对象

public class AnnotationTest1

3、利用反射进行测试 这个类上是否有注解@ItcastAnnotation

if(AnnotationTest1.class.isAnnotationPresent(ItcastAnnotation.class)){
		ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest1.class.getAnnotation(ItcastAnnotation.class);
		System.out.println(annotation);
}

4@Retention 的三种取值(枚举值):RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME  分别对应:java源文件—>calss文件—>内存中的字节码

@Override ---java源文件,SOURCE

@ SuppressWarning-- java源文件,SOURCE

@ Deprecated--- RUNTIME  

 

  retention 元注解,用于说明注解的生命周期,默认值在.class阶段

5@Target  用于说明注解能用于哪个成分上

@Target({ElementType.METHOD,ElementType.TYPE})

ElementType.METHOD方法上

ElementType.TYPE类上

 java.lang.annotation -- ElementType

  •  为注解增加基本属性

1、定义基本类型的属性和应用属性

String color() default "blue";//缺省属性blue

2、 用反射获得注解对应的实例对象后,再通过该对象调用属性对应的方法

ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest1.class.getAnnotation
(ItcastAnnotation.class);
		System.out.println(annotation.color());

3·为属性指定缺省值   default "blue";

4value属性

 String Value();

 如果注解中只设置一个value属性,其他属性采用默认值,可以省略“value=
       5、数组类型的属性

int[] arrayAttr() default{3,4};

6、枚举类型的属性

EnumTest.TrafficLamp lamp() 

default EnumTest.TrafficLamp.RED;

7、注解类型的属性

MetaAnnotation anntationAttr() default @MetaAnnotation("ddd");

8、注解属性的返回值类型

  8个原始类型、字符串类型、Classannotationenum、包括前面类型是数组

注意:在程序中创建注解的实例对象,直接用@带上标记即可




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值