反射学习 笔记
ReflectTest.java
package com.hoocy.day1;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Arrays;public class ReflectTest {public static void main(String[] args) throws Exception {String s = "abc";Class c1 = s.getClass();Class c2 = String.class;Class c3 = Class.forName("java.lang.String");System.out.println(c1 == c2);System.out.println(c1 == c3);// 判断是否基础类型 返回FALSESystem.out.println(c1.isPrimitive());// 判断 返回TRUESystem.out.println(int.class.isPrimitive());// 判断是否数组System.out.println(int[].class.isArray());// new String(new StringBuffer("abc"));// 通过反射的形式参数这样的效果Constructor constructor = String.class.getConstructor(StringBuffer.class);String str2 = (String) constructor.newInstance(new StringBuffer("abc"));System.out.println("str2=" + str2);// 使用不带参数的构造方法// String.class.newInstance();// 成员变量的反射// private int x; public int y;ReflectPoint pt1 = new ReflectPoint(3, 5);Field fieldy = pt1.getClass().getField("y");System.out.println(fieldy.get(pt1));// 输出5// Field fieldx = pt1.getClass().getField("x");// 报错:java.lang.NoSuchFieldException:// System.out.println(fieldx.get(pt1));// 通过这种方法可以得到 private int x 的值Field fieldx = pt1.getClass().getDeclaredField("x");fieldx.setAccessible(true);System.out.println(fieldx.get(pt1));// 输出3changeStringValue(pt1);System.out.println(pt1);// Method 类 调用str1.charAt(1);Method methodCharAt = String.class.getMethod("charAt", int.class);// 输出b 利用反射的形式得到该方法// 两种方式调用// JDK1.5方式System.out.println(":" + methodCharAt.invoke("abc", 1));// JDK1.4方式System.out.println(":" + methodCharAt.invoke("abc", new Object[] { 2 }));// 直接调用方式// TestArguments.main(new String[] { "123", "1bc", "hhh" });// 尝试用反射方式调用TestArguments中的main方法// String startClassName = args;// Method mainMethod = Class.forName(startClassName).getMethod("main",// String[].class);// // 调用静态方法,第一个参数为空// mainMethod.invoke(null, new Object[] { new String[] { "111", "222",// "333" } });// mainMethod.invoke(null, (Object) new String[] { "aaa", "bbb", "ccc"// });System.out.println("--------------数组反射相关-----------------");// 数组 反射int[] a1 = new int[]{1,2,3};int[] a2 = new int;int[][] a3 = new int;String[] a4 = new String[]{"a","b","c"};System.out.println(a1.getClass() == a2.getClass());// true 维数相同 类型相同// 字节码相同System.out.println(a1.getClass() == a3.getClass());// falseSystem.out.println(a1.getClass() == a4.getClass());// falseSystem.out.println(a1.getClass().getName());System.out.println(a1.getClass().getSuperclass().getName());System.out.println(a4.getClass().getSuperclass().getName());Object aObj1 = a1;Object aObj2 = a4;//Object[] aObj1 = a1;//不可以Object[] aObj4 = a3;//可以放二维Object[] aObj5 = a4;//可以放StringSystem.out.println(a1);System.out.println(a4);System.out.println("************分隔符************");System.out.println(Arrays.asList(a1));//输出[System.out.println(Arrays.asList(a4));//输出}// 通过字段反射改变对象某属性值private static void changeStringValue(Object obj)throws IllegalArgumentException, IllegalAccessException {// 得到point所有字段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.toString());}}}
ReflectPoint.java
package com.hoocy.day1;public class ReflectPoint {@Overridepublic String toString() {return (":" + this.str1 + " " + this.str2+" "+this.str3);}private int x;public int y;public String str1 = "ball";public String str2 = "basketball";public String str3 = "hoocy";public ReflectPoint(int x, int y) {super();this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}}
页:
[1]