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";
4、value属性
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个原始类型、字符串类型、Class、annotation、enum、包括前面类型是数组
注意:在程序中创建注解的实例对象,直接用@带上标记即可