理解面向对象编程(四)-Junit、反射和BeanUtils:

 * 1.Junit

    @Before

    @Test

    @After

    Assert(target,function)

 * 2.JDK5.0新特性-静态导入

    import staticjava.lang.System.out;

    使用时直接使用:

    out.println("sdasd");

 * 3.枚举和Junit的demo

    import static java.lang.System.out;

    public class Test1 {

      

       @org.junit.Test

       public  void test(){

           print(Grade.A);

       }

      

       public void print(Grade g){

           String value = g.getValue();

           out.println(value);

       }

       enum Grade{

           A("100-90");

           private String value;

            * 构造方法必须为私有

           private Grade(String value) {

              this.value = value;

           }

          

           public String getValue() {

              return value;

           }

   

           public void setValue(String value) {

              this.value = value;

           }  

       }

    }

 * 4.反射

    加载类:Class.forName()

    通过构造函数创建:

        getConstructorz只能获取public的构造方法

        Person p = class.getConstructor(String.class).newStance("")

        //getDeclaredConstructor可以获得public以外的private

        class.getConstructor(String.class).setAccessible(true)//暴力反射

     直接创建:

     class.newStance()//得注意是否是无参数的构造函数

 * 5.反射类的方法和字段

       Personperson=new Person();

       Class clazz = Class.forName(className);

       Method m = clazz.getMethod(name, String.class,int,class);

       m.invoke(person, String,int);  

    如果是static方法,则在invoke(null,parmeter)

    字段:

        Person person=new Person();

       Class clazz = Class.forName(className);

       Filed f =clazz.getField("name");

       //字段类型可以通过f.getType()获取

       String name = (String)f.get(p);//获取

       f.set(p,"')//设置字段的值

       m.invoke(person, String,int);     

 * 6.内省Introspecter

    用于操作java对象的属性

    javabean是成员私有并且提供公共的setter getter

    拥有get或set方法的字段才能称为属性

    @Test获取所有方法

    public void test() throws IntrospectionException{

       BeanInfo info = Introspector.getBeanInfo(User.class);

       PropertyDescriptor[] pds = info.getPropertyDescriptors();

       for(PropertyDescriptor pd : pds){

           System.out.println(pd.getName());

       }

    }  

       @Test

    public void test2() throws Exception{

       User user = new User();

       PropertyDescriptor pro = new PropertyDescriptor("name",User.class);

       Method m = pro.getReadMethod();

       m.invoke(user, null);

       m = pro.getWriteMethod();

       m.invoke(user, 45);

    }

 * 7.使用beanUtils操纵javabean

    加入beanUtils两个jar,调用即可

    commons-beanutils-1.8.3.jar

    commons-logging-1.3.jar

    Test:

       Useruser = new User();

       BeanUtils.setProperty(user, "name", "zhang");

       System.out.println(user.getName());

 * 8.日期转换器

    //beanUtils的日期转换器

    @org.junit.Test

   

    public void test2() throws Exception{

       String birthday ="1998-08-01";

       User user = new User();

       //日期转换器

       ConvertUtils.register(new Converter() {

 

           @Override

           public Object convert(Class type, Object value) {

              if(value==null){

                  return null;

              }

              String str = (String) value;

              SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");            

              try {

                  return df.parse(str);

              } catch (ParseException e) {

                  throw new RuntimeException(e);//异常链不能断

              }

           }

       }, Date.class);

      

       BeanUtils.setProperty(user, "birthday",birthday);

       Date date = user.getBirthday();

       System.out.println(date.toLocaleString());

    }

 * 10.通过Map获取

 * Map.put(key,value);

 * BeanUtils.populate(user,map)

 * 11.泛型不恩能够是基本数据类型,必须是引用数据类型

12.异常处理掌握的原则:

  如果对上一层有好处,就throws

  如果没有好处,就转为运行时异常

 

你可能感兴趣的:(java,反射,JUnit,BeanUtils,面向对象编程)