心得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"}); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了