package javase.gaoxin.jishu; import java.lang.reflect.Array; import java.util.Arrays; public class Array_Reflect_Test { /*数组的4种初始化方式*/ public static void main(String[] args) { int [] i = new int[]{1,2,3,4,5};//注意这种方式new Object[]中“[]”内不能写任何东西 String [] s = {"a","b","c","d","e"}; Object [] o1 = new Object[5]; Object [] o2 = new Object[5]; o2[0] = 1; o2[1] = 2; o2[2] = 3; o2[3] = 4; o2[4] = 5; String s1="aa"; /*‘原始类型’的‘数组’【不能】‘转换’成‘Object类型’的【数组】*/ //o1 = i; /*元素类型的值可以转成Object类型的,这是因为元素类型会自动转换成起包转类型,而包装类型为应用类型*/ Object o = 8; /*而‘引用类型’的都可以转换成‘Object类型’的‘数组’,这跟引用类型都是Object的子类型道理是一样的*/ o1 = s; //看控制台,直接打印数组时看不到数组中的内容的 System.out.println(i); //★★★★★想【直接】就可以看到‘数组’中的元素的方法: System.out.println(Arrays.toString(i)); //‘集合’是可以通过‘打印’【直接】就可以看到里面元素的,故‘数组’可以通过‘转换’成‘集合’, //然后打印集合就可以看到原来数组的元素了; //★★★数组转集合的方法:Arrays.asList(Object[] o) //★★★但是,‘原始类型(基本类型)’的数组转换成‘集合’后再打印时‘看不到’其中的元素的 //这是因为:asList(Object[] o)需要传一个Object类型的数组,而基本类型的数组时无法转成Object数组的 System.out.println(Arrays.asList(s)); System.out.println(Arrays.asList(i)); getObjectInfo(i); getObjectInfo(s); getObjectInfo(s1); } /*如何利用反射获取数组的信息?这就要用到'java.lang.reflect.Array'这个类*/ public static void getObjectInfo(Object o){ Class c = o.getClass(); if(o.getClass().isArray()){ int in = Array.getLength(o); for(int i1=0;i1<in;i1++){ Object k = Array.get(o, i1); System.out.print(k+","); } System.out.println(); }else{ System.out.println(o); } } }
package javase.gaoxin.jishu; import java.lang.reflect.Field; public class ReflectTest { public static void main(String[] args) { /*获得一个类的‘字节码实例'(即'类名.Class',它代表一个‘类’型在电脑中一个‘唯一’标识的字节码,注意:每个‘类’只有‘唯一’的一个这样的字节码实例) * 有3中方法: * 1)类名.Class * 2)类的实例.getClass() * 3)Class.forName(String className) */ ReflectTest1 rt = new ReflectTest1(2,3); Class c = rt.getClass(); Field [] fields = c.getFields(); for(Field field:fields){ if(field.getType()==String.class){ try { String oldV = (String)field.get(rt); String newV = oldV.replaceAll("b", "a"); System.out.println(newV); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else { if(field.getModifiers()==1){ try { String name = field.getName(); Field f = c.getDeclaredField(name);//获得访问修饰符是private的’成员名‘的方法 System.out.println(name); f.setAccessible(true); Integer y =(Integer)f.get(rt); System.out.println(y);//看控制台,为什么没有打印出y的值,原因是:前面用for(field:fields)这个地方就不会遍历访问修饰符为private的成员 } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } else{ try { System.out.println(field.get(rt)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } }
package javase.gaoxin.jishu; public class ReflectTest1 { public int x=0; private int y=0; public String s1="ball"; public String s2="basketball"; public String s3="string"; public ReflectTest1(int x,int y){ super(); this.x=x; this.y=y; } }