心得24--JDK新特性8-反射3-Method方法.doc

1. Field对象提供了如下方法,用于设置、获取对象属性的值:

public void set(Object obj,Object value)

public Object get(Object obj)

  案例分析:

packagecom.java.reflect;

importjava.lang.reflect.Field;

importorg.junit.Test;

publicclass Demo4 {

   @Test

   publicvoid test1()throws ClassNotFoundException,NoSuchFieldException, SecurityException, IllegalArgumentException,IllegalAccessException {

      Person p = new Person();

      Class c = Class.forName("com.java.reflect.Person");

      Field f = c.getField("sex");

      System.out.println(f.get(p)+"..."+f.getType());

   }

   @Test

   publicvoid test2()throws ClassNotFoundException,NoSuchFieldException, SecurityException, IllegalArgumentException,IllegalAccessException {

      Person p = new Person();

      Class c = Class.forName("com.java.reflect.Person");

      Field f = c.getField("sex");

      f.set(p,"nv");

      System.out.println(f.get(p));

   }

}

2. 获取类的信息实例操作

packagecom.java.reflect;

importjava.lang.reflect.Modifier;

importorg.junit.Test;

publicclass Demo5 {

   @Test

   publicvoid test1()throws ClassNotFoundException {

      Class c = Class.forName("com.java.reflect.Person");

      System.out.println(c.getPackage()); //获取此Class对象所对应的实体所在的包的信息

      System.out.println(c.getPackage().getName());//获取该类所在包的全名

     

      int mod = c.getModifiers();

      System.out.println(mod);//获取此Class对象所对应的实体用整数表示的类修饰符

      String m = Modifier.toString(mod);

      System.out.println(m);//转换成对应的字符串

     

      System.out.println(c.getName()); //获取完全限定名

      System.out.println(c.getSuperclass());//获取此Class对象所对应的实体的直接父类的Class对象

      System.out.println(c.getInterfaces());//获取此Class对象所对应的实体的所以接口对象

   }

}

3. jdk1.4和jdk1.5的invoke方法的区别:

a)    Jdk1.5:public Objectinvoke(Object obj,Object... args)

b)    Jdk1.4:public Objectinvoke(Object obj,Object[] args),

问题:

启动Java程序的main方法的参数是一个字符串数组,即public static voidmain(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[]{“xxx”}),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。

解决办法:

mainMethod.invoke(null,newObject[]{new String[]{"xxx"}});

mainMethod.invoke(null,(Object)newString[]{"xxx"}); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了

 

posted @ 2012-09-19 17:37  yangkai_keven  阅读(140)  评论(0编辑  收藏  举报