【0】README
1)本文旨在 review java反射荔枝;
【1】荔枝如下
【2】实例化Class类对象
@Test // 实例化Class类对象public void testInitializeClassObject() {Class c1;Class c2;Class c3;try {c1 = Demo.class; // way1.c2 = new Demo().getClass(); // way2.c3 = Class.forName("com.basic.reflection.Demo"); // way3.System.out.println(c1);System.out.println(c2);System.out.println(c3);System.out.println(c3.getName());} catch (Exception e) {e.printStackTrace();}/*** class com.basic.reflection.Demo* class com.basic.reflection.Demo* class com.basic.reflection.Demo* com.basic.reflection.Demo*/}
【3】返回一个类实现的接口
@Test // 返回一个类实现的接口public void testGetInstancesImplemented() {Class c1;try {c1 = Triangle.class;Class[] interfaces = c1.getInterfaces();for (Class temp: interfaces) {System.out.println(temp.getName());}// com.basic.reflection.Shape} catch (Exception e) {e.printStackTrace();}}// Class 类的 getDeclareFields、getDeclareMethods、getDeclaredConstructors // 方法将分别返回类中声明的全部域、方法和构造器;其中包括私有方法和受保护成员,但不包括超类成员.
【4】利用反射分析类的能力
@Test // 利用反射分析类的能力public void testAnalyzeClass() {Class c1;try {c1 = Triangle.class;Field df1 = c1.getDeclaredField("width");df1.setAccessible(true);System.out.println(df1.getName()); // width.Triangle t = new Triangle(1000, "i am a triangle.");int age = df1.getInt(t);System.out.println(age); // 1000Method m1 = c1.getDeclaredMethod("sayShape", new Class[]{String.class, int.class});m1.invoke(t, new Object[]{"i am a triangle", 9999}); // 调用方法.// sayShape() -> i am a triangle 9999 } catch (Exception e) {e.printStackTrace();}}
【5】实例化对象
@Test // 实例化对象public void testInstanceObject() {Class c1;try {c1 = Class.forName("com.basic.reflection.Demo");Demo d1 = (Demo)c1.newInstance(); // 调用默认构造器System.out.println(d1.getIntField()); // 1// 利用构造器创建对象实例(推荐).Constructor con = c1.getDeclaredConstructor(new Class[]{int.class, String.class});Demo d2 = (Demo) con.newInstance(new Object[]{110, "110"});System.out.println(d2.getIntField() + d2.getStrField()); // 110110} catch (Exception e) {e.printStackTrace();}}
【6】通过反射取得并修改数组的信息
@Test // 通过反射取得并修改数组的信息public void testOperateArray() {int[] array = {1, 1, 0};Class<?> demo = array.getClass().getComponentType(); // 数组类型的Class对象.out.println("array type = " + demo.getName()); // 数组类型为int.out.println("array length = " + Array.getLength(array)); out.println("1st element in array = " + Array.get(array, 0)); // 通过下标取得数组元素Array.set(array, 0, 100); //修改数组的第一个元素为100(下标为0)out.println("after modification, 1st element in array is " + Array.get(array, 0));} /* output.array type = intarray length = 31st element in array = 1after modification, 1st element in array is 100*/// 通过反射修改数组大小public static Object modifyArraySize(Object obj, int start, int newLen) {int oldLen = Array.getLength(obj);Class<?> arrayType = obj.getClass().getComponentType();Object newArray = Array.newInstance(arrayType, newLen);newLen = newLen > oldLen ? oldLen : newLen;System.arraycopy(obj, start, newArray, 0, newLen);return newArray;}public static void print(Object obj) {int length = Array.getLength(obj);Class<?> c = obj.getClass();if(!c.isArray())return ;out.println("array length :" + length);for (int i = 0; i < length; i++)out.print(Array.get(obj, i) + " "); // Array.get(obj, i) == obj[i] }@Test// modify the size of arraypublic void testModifyArraySize() {int[] array = {1, 7, 6, 0, 8};int[] newArray = (int[])modifyArraySize(array, 0, 3);System.out.println("after modifying the array size to 3.");for(int i : newArray) {out.print(i + " ");}out.println();print(newArray);newArray = (int[])modifyArraySize(array, 0, 8);//当新数组长度大于原始数组长度的时候System.out.println("after modifying the array size to 8.");print(newArray);} // 通过反射修改数组大小 over. /*after modifying the array size to 3.1 7 6 array length :31 7 6 after modifying the array size to 8.array length :81 7 6 0 8 0 0 0 */