黑马程序员--加强之reflection

来源:互联网 发布:两个excel重复数据筛选 编辑:程序博客网 时间:2024/05/23 02:02

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

package cn.itcast.day1;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Arrays;public class ReflectTest{/** * @param args * @throws ClassNotFoundException  * @throws NoSuchMethodException  * @throws SecurityException  * @throws InvocationTargetException  * @throws IllegalAccessException  * @throws InstantiationException  * @throws IllegalArgumentException  * @throws NoSuchFieldException  */public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException{String str1 = "abc";Class clazz1 = str1.getClass();Class clazz2 = String.class;Class clazz3 = Class.forName("java.lang.String");System.out.println(clazz1 == clazz2); //trueSystem.out.println(clazz1 == clazz3); //true : only one class byte file exsists in the memory!//类型System.out.println(clazz1.isPrimitive()); // String'object is not primitive typeSystem.out.println(int.class.isPrimitive());//trueSystem.out.println(int.class == Integer.class);//false System.out.println(int[].class.isPrimitive());//数组也不是原生类型System.out.println(int[].class.isArray());// 数组类型与原生类型并列//构造函数Constructor constructor1 = String.class.getConstructor(StringBuffer.class);//得到Constructor的实例String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));//调用其方法去获得实例System.out.println(str2.charAt(2));//自定义类的反射ReflectPoint pt1 = new ReflectPoint(3,5), pt2 = new ReflectPoint(4, 6);Field fieldY = pt1.getClass().getField("y");// 获取的是类的字段信息System.out.println(fieldY.get(pt1)); //public field can be getted! 3System.out.println(fieldY.get(pt2)); //public field can be getted! 5Field fieldX = pt1.getClass().getDeclaredField("x");// not the same with the public fieldsfieldX.setAccessible(true);// access private field.System.out.println(fieldX.get(pt1));//用反射改变对象的值changeStringValue(pt1); System.out.println(pt1);// 方法Method methodCharAt = String.class.getMethod("charAt", int.class);System.out.println(methodCharAt.invoke(str1, 1));System.out.println(methodCharAt.invoke(str1, new Object[]{1}));//variable parameter//反射调用 TestArguments .main方法String startingClassName = args[0];System.out.println(startingClassName);Method methodMain = Class.forName("cn.itcast.day1."+startingClassName).getMethod("main", String[].class);//methodMain.invoke(null, (Object)new String[]{"11", "22", "33"});//静态方法无需传入调用者对象methodMain.invoke(null, (Object)new String[]{"11", "22"});//静态方法无需传入调用者对象,防止拆分吧int [] a1 = new int[]{1,2,3};Integer [] a11 = new Integer[]{1,2,3};int [] a2 = new int[4];int[][] a3 = new int[2][3];String [] a4 = new String[]{"a","b","c"};System.out.println(a1.getClass() == a2.getClass()); //true//System.out.println(a1.getClass() == a4.getClass());//System.out.println(a1.getClass() + a3.getClass());System.out.println(a1.getClass().getName()); //[ISystem.out.println(a11.getClass().getName()); //[Ljava.lang.Integer;System.out.println(a4.getClass().getName()); //[Ljava.lang.String;System.out.println(a3.getClass().getName()); //[[ISystem.out.println(a1.getClass().getSuperclass().getName());//java.lang.ObjectSystem.out.println(a4.getClass().getSuperclass().getName());//java.lang.ObjectObject aObj1 = a1;Object aObj3 =  a3;Object[] aObj33 = a3;//Object[] aObj11 = a1; //can't convert from int[] to Object[];Object[] aObj44 = a4; // ar is a Object(String) array.System.out.println(a1);//[I@10b30a7System.out.println(a4);//[Ljava.lang.String;@1a758cbSystem.out.println(Arrays.asList(a1));//[[I@10b30a7] 将a1作为一个对象传入进去System.out.println(Arrays.asList(a4));//[a, b, c]}private static void changeStringValue(Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{Field[] fields = obj.getClass().getFields();for(Field field : fields){if(field.getType() == String.class){String oldValue = (String) field.get(obj);String newValue = oldValue.replace('b', 'a');field.set(obj, newValue);}}}}class TestArguments{public static void main(String[] args){for(String arg : args)System.out.println(arg);}}

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