您的位置:首页 > 编程语言 > Java开发

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

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: