黑马程序员--反射的一些相关笔记摘要

来源:互联网 发布:linux chm手册 编辑:程序博客网 时间:2024/05/25 21:35
private static void printObject(Object obj){Class clazz = obj.getClass();if(clazz.isArray()){int len = Array.getLength(obj);for(int i = 0;i<len;i++){System.out.println(Array.get(obj,i));}}else{System.out.println(obj);}}BeanUtils.setProperty(pt1,"birthday.time","111");System.out.println(BeanUtils.getProperty(pt1,"birthday.time").getClass().getName())  返回的是 java.lang.String,所以这里传递的值是字符串“111”PropertyUtils.setProperty(pt1,"birthday.time",1);System.out.println(PropertyUtils.getProperty(pt1,"x").getClass().getName());返回的是java.lang.Integer,所以这里传递的值是1,


---------------------- android培训、java培训、期待与您交流! ----------------------

 

如何得到各个字节码对应的实例对象(Class类型)
1,类名.class 例如:System.class
2.对象.getClass(),例如:new Date().getClass()
3.Class.forName("类名") 例如:Class.forName("java.util.Date")  反射时用
九个预定义Class实例对象:八种基本类型,和void

Constructor constructor1 = String.class.getConstructor(StringBuffer.class)
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));

Constructor类代表某个类中的一个构造方法
1.得到某个类所有的构造方法:
Constructor[] constructor  =  Class.forName("java.lang.String").getConstructors();
3.得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
3.创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"))
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"))
问题:
启动java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按

jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打

散成为若干个单独的参数,所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[]{"xxx","xxx","xxx"}),javac只把它当做jdk1.4的语法进行理解,而不把它当做jdk1.5的语法解释,因

此会出现参数类型不对的问题。
解决办法:
mainMethod.invoke(null,new Object[]{new String[]{"xxx","xxx","xxx"}});或者
mainMethod.invoke(null,(Object)new String[]{"xxx","xxx","xxx"}),编译器会做特殊处理,编译时不把参数当做数组看待,也就不会数组打散成若干个参数了.
-------------------------------------
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
Object aObj1= a1; 通过。
Ojbect aObj2= a4; 通过
Object[] aObj3 = a1; 不能通过
Object[] aObj4 = a3; 通过
Object[] aObj5 = a4; 通过
-------------------------------------
Arrays.asList()方法处理int[]和String[]时的差异
int[] a1 = new int[]{3,5,7,8};
String[] a4 = new String[]{"a","b","c"};
System.out.println(Arrays.asList(a1))  打印结果是[[I@哈希数值]]
System.out.println(Arrays.asList(a4))  打印结果是[a,b,c]
---------------------------------------

 

 

 

---------------------- android培训、java培训、期待与您交流! ----------------------