java反射Constructor,Method,Field,Array 类
/** * 反射就是将java类中的各个成分映射成java类,方法有Method类,包有Package类,构造方法有Constructor类 * 反射主要用处 Spring等框架 在配置文件中配置某个累 就可以修改成员变量的值,方法 等等 */ package weiguoyuan.chainunicom.cn; import java.lang.reflect.Array; 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 TestReflect { public static void main(String[] args) { /* * TestConstructor 测试构造方法类 */ try { Constructor [] constrs = Class.forName("java.lang.String").getConstructors();//得到String的所有构造方法 Constructor constr = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//getConstructor(StringBuffer.class)的参数是可变参数Class<?>... //new String(new StringBuffer("abc")) try { constr.newInstance(new StringBuffer("abc")); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } /* * TestField 测试成员变量的反射 */ Point p1 = new Point(3,5); try { Field fieldY = p1.getClass().getField("y"); //Field fieldX = p1.getClass().getField("x");// error x is private 看不到有没有该成员 看不到有钱 Field fieldX1 = p1.getClass().getDeclaredField("x");//得到所有的成员变量,能看到成员变量了 能看到钱了 取不到 fieldX1.setAccessible(true);//设置暴力反射 上去抢 System.out.println(fieldY);//the output is "public int weiguoyuan.chainunicom.cn.Point.y" try { System.out.println(fieldY.get(p1));// the output is 5 System.out.println(fieldX1.get(p1)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } /* * 修改成员变量的值的应用 */ try { changeStringValue(p1); System.out.println(p1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } /* * TestMethod 测试成员方法的反射 */ try{ Method methodCharAt = String.class.getMethod("charAt", int.class);//第一个函数名 第二个传人的参数类型 System.out.println(methodCharAt.invoke(p1.str, 2));//invoke 调用,当调用的函数是静态的可以用invoke(null, 2) }catch(Exception e){ e.printStackTrace(); } /* * TestArray 测试数组和Object的关系及其反射类型 */ int [] arr1 = new int [3]; int [] arr2 = new int []{1,2}; int [] [] arr3 = new int [3][3]; String [] arr4 = new String[]{"a","b","c"}; System.out.println(arr1.getClass() == arr2.getClass());//结果是 ture arr1和arr2的数组类型相同并且纬度相同 //System.out.println(arr1.getClass() == arr3.getClass()); //System.out.println(arr1.getClass() == arr4.getClass()); System.out.println(arr1.getClass().getSuperclass().getName());//结果父类是Object类 Object obj1 = arr2; System.out.println(Arrays.asList(arr2));//int[]数组只是被看待成一个Object对象 输出值是[[I@50ba0dfc] System.out.println(Arrays.asList(arr4));//String 数组是Object[]的 三个值 输出值是[a, b, c] /* * 数组反射测试 TestArray */ Object obj = null; printObject(obj); printObject(arr2); } public static void printObject(Object obj){ if(obj.getClass().isArray()){ for(int i = 0;i < Array.getLength(obj);i++){ //Array 是数组的反射类 System.out.println(Array.getInt(obj, i)); } }else{ System.out.println(obj); } } public static void changeStringValue(Object obj) throws Exception{ 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 Point { private int x; public int y; public String str = "bbbbcca"; public Point(int x, int y) { super(); this.x = x; this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Point other = (Point) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } 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; } public String toString(){ return str + "x=" + this.x + "y=" + this.y; } }
posted on 2014-08-21 16:58 weiguoyuan 阅读(216) 评论(0) 收藏 举报
浙公网安备 33010602011771号