java反射的基础学习代码

1 package javaAdvanced;java.lang.reflect.*; 4 import java.util.Arrays; * 类的描述信息 8 * 反射的练习 9 * cuiH 1.5 ReflectTest {* 反射:将java中各个成分 映射到相应的java类上面 17 * 就是说你想去到java类的一些信息,就需要用到反射。(类信息层面的控制)main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException {Constructor constructor = String.class.getConstructor(StringBuffer.class);System.out.println(strTest.charAt(3));* 作用,得到每个类的构造方法 29 * 然后调用该方法下面的构造器 30 * 正常情况下是:class——》constructor->new object 31 * 使用constructor->调用 constructor,调用objReflectPoint pt1 = new ReflectPoint(3, 5);fieldY.get(pt1);System.out.println(fieldY.get(pt1));* result:java.lang.NoSuchFieldException 若是getFiled访问私有方法时:报错没有改域 43 * 对于私有需要用 getDeclaredFieldField fieldX = pt1.getClass().getDeclaredField(“x”); 46fieldX.setAccessible(true); 47 System.out.println(fieldX.get(pt1));* result:java.lang.IllegalAccessException 提示非法错误,可以进行去到,但是仍然无法用, 50 * 需要暴力输出:fieldX.setAccessible(true); 强制设定为可以进入(暴力进入)changeStringValueBToA(pt1); 55Field[] fieldStr = pt1.getClass().getFields(); 56System.out.println(“b变为a更改后为:”); 57for (Field field : fieldStr) { 58 System.out.println(field.get(pt1)); 59 }Method methodCharAt = String.class.getMethod(“charAt”, int.class); 64methodCharAt.invoke(strTest, 3); 65System.out.println(methodCharAt.invoke(strTest, 3));* 获取方法(踩刹车) 68 * 调用方法(刹车调用停车的方法),面向对象的设计 69 * 相当于获取了静态方法,静态引入 70 * 注意jdk1.4之前没有可变参数,System.out.println(methodCharAt.invoke(strTest, TestArguments.main(String className = “javaAdvanced.TestArguments”; 77Method mainMethod = Class.forName(className).getMethod(“main”, String[].class); 78mainMethod.invoke(null, new Object[]{new String[]{“cuiHuan”, “like”, “java”}});[] a1 = new int[]{2, 1, 3};[4];[2][3]; 84String[] a5 = new String[2]; 85String[] a6 = new String[3]; 86String[] a4 = new String[]{“a”, “b”, “c”};System.out.println(“String比较:” + (a5 == a6));System.out.println(“a1字节码的名字:” + a1.getClass().getName()); 90System.out.println(“a2字节码的名字:” + a2.getClass().getName());System.out.println(“一维数组的父类的字节吗的名字:” + a1.getClass().getSuperclass().getName()); System.out.println(“二维数组的父类的字节吗的名字:” + a3.getClass().getSuperclass().getName()); System.out.println(“String的父类的字节吗的名字:” + a4.getClass().getSuperclass().getName()); Object obj1 = a1; Object obj2 = a4;Object[] obj4 = a3;System.out.println(“输出为string的a1:” + Arrays.toString(a1));System.out.println(“输出为list的a1:” + Arrays.asList(a1));System.out.println(“直接输出数组:” + a4);System.out.println(“输出为list的a1:” + Arrays.asList(a4)); * 之前可以发现,,数组的本质一个对象,二维相当于一组对象,对于asList获取的是对象的地址108 * 当数组或者String没有初始化之前,他们共用一个字节码。(object)109 *110 * 数组反射的应用111 * 现在如果要改变数组的其中一个元素System.out.println(“数组反射的应用:打印数组中的每个元素”);printObject(printObject(“String”); } printObject(Object obj) {123Class cls = obj.getClass();124if (cls.isArray()) {125int length = Array.getLength(obj);126for (int i = 0; i < length; i++) {127System.out.print(Array.get(obj, i) + ” “);128 }129} else {130 System.out.println(obj);131 }132 133 }changeStringValueBToA(Object obj) throws IllegalAccessException {137Field[] fields = obj.getClass().getFields();138for (Field field : fields) {(field.getType() == (String.String oldValue = (String) field.get(obj);142String newValue = oldValue.replace(‘b’, ‘a’);143 field.set(obj, newValue);144 }145 }146 }} TestArguments { main(String[] args) {154for (String arg : args) {155 System.out.println(arg);156 }157 }158 }

生气是拿别人做错的事来惩罚自己

java反射的基础学习代码

相关文章:

你感兴趣的文章:

标签云: