黑马程序员_java学习日记_Java高新技术_内省和注解

 

----------------------- android培训、java培训java学习型技术博客、期待与您交流! ----------------------

 

java内省:

JavaBean是一种特殊的java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果 要在两个模块之间传递信息,可以将、这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称叫什么好呢?JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId中文意思即为设置id,至于你把它存到哪个变量上,是有约定的,同样方法getId中文意思即为获取id,至于你从那个变量上取,也是有约定的,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余不封的首字母改成小写的。

setId()的属性名->id
isLast()的属性名->last
setCPU()的属性名->CPU
getId()的属性名->id
getCPU()的属性名->CPU

这些属性名都是private的,JavaBean类的构造函数和getter和setter方法都是public的
总之,一个类被当作Javabean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。

一个符合javabean特点的类可以当作普通类一样进行使用,但把它当JavaBean方式进行操作,肯定能带来一些好处,解决一些问题,不然我们用它干嘛呢,在javaee开发中经常使用到Javabean。很多环境就要求按Javabean方式进行操作,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.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class IntroSpectorTest {

 
 public static void main(String[] args)throws Exception {
  PointDemo pt1 = new PointDemo(1,1);
  String propertyName = "x";
  Field fieldX = pt1.getClass().getDeclaredField("x");
  fieldX.setAccessible(true);
  
  System.out.println(fieldX.get(pt1));
  Method methodGetX = pt1.getClass().getMethod("getX");
  System.out.println(methodGetX.invoke(pt1));
  
  Object getValue = getProperty(pt1, propertyName);
  
  System.out.println(getValue);
  Object setValue = 5;
  setProperty(pt1, propertyName, setValue);
  
  
  System.out.println(pt1.getX());
 }

 private static void setProperty(PointDemo pt1, String propertyName,
   Object setValue) throws IntrospectionException,
   IllegalAccessException, InvocationTargetException {
  PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
  Method methodSetValue = pd2.getWriteMethod();
  methodSetValue.invoke(pt1, setValue);
 }

 private static Object getProperty(PointDemo pt1, String propertyName)
   throws IntrospectionException, IllegalAccessException,
   InvocationTargetException {
  //简单内省方法,得到具体某个属性属性描述类PropertyDescriptor
  //PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
  //Method methodGetValue = pd.getReadMethod();
  //Object getValue = methodGetValue.invoke(pt1);
  Object getValue = null;
  BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
  PropertyDescriptor [] pds =beanInfo.getPropertyDescriptors();
  //复杂内省法得到所有属性描述PropertyDescriptor []数组然后逐个遍历
  for(PropertyDescriptor pd:pds){
   if(pd.getName().equals(propertyName)){
    Method methodGetValue = pd.getReadMethod();
    getValue = methodGetValue.invoke(pt1);
    break;
   }
  }
  return getValue;
 }

 }

beanutil工具包的使用:从中学习到了要善于使用工具,站在巨人的肩膀上前进,很好很强大。。。。。。


Java注解:

注解相当于一种标记,加了注解就等于打上某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。Java.lang包中可以看到jdk提供的最基本的annotation

@SupperessWarnings 告诉编译器不提示警告

@Deprecated 提示方法过时

@Override 提示下面的方法是重写

注解的应用:
注解类
 @interface A
{
}

应用注解的类
@A
class B
{
}

测试注解的类
class C{
B.class.isAnnotationPresent(A.class);
A a = B.class.getAnnotion(A.class)
}

@Retention元注解:有三种取值RetentionPolicy.SOURCE,RentionPolicy.CLASS,RentionPolicy.RUNTIME;

@SupperessWarnings ->RetentionPolicy.SOURCE
@Deprecated        ->RetentionPolicy.RUNTIME
@Override          ->RetentionPolicy.SOURCE

@Target元注解:
枚举 ElementType
ANNOTATION_TYPE
          注释类型声明
CONSTRUCTOR
          构造方法声明
FIELD
          字段声明(包括枚举常量)
LOCAL_VARIABLE
          局部变量声明
METHOD
          方法声明
PACKAGE
          包声明
PARAMETER
          参数声明
TYPE
          类、接口(包括注释类型)或枚举声明

注解的属性:
什么是注解的属性:一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是黑马的学生,否则,就不是。如果还想区分出是黑马那个班的学员,这时候可以为胸牌增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color = "red")

属性的返回值可以是基本类型 String类型 Class类型 注解类型 数组类型 枚举类型

定义基本类型的属性和应用属性:在注解中增加String color();赋值@MyAnonotation(color = "red")
为属性指定缺省值:String color() default "yellow";

value属性:
String value() default "zxx";
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么你可以省略value = 部分,例如:@MyAnnotation("OnlyValue")。

 

----------------------- android培训、java培训java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

你可能感兴趣的:(黑马程序员_java学习日记_Java高新技术_内省和注解)