Java反射机制
2012-08-18 18:31
309 查看
注意: Java反射机制主要用在框架中,如Spring/JUnit等,如果你不写框架(大部分人不写),这部分的知识用到的就比较少。所以现在了解即可,用到时再仔细看。
一、
得到字节码的三种方式:
1 Class cls = Date.class;
2 Person p = new Person();
Class cls = p.getClass();
3 Class.forName("java.lang.String");
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也有相应的 Class与之对应。
二、传智播客的反射例子
//ReflectionPoint.java
一、
得到字节码的三种方式:
1 Class cls = Date.class;
2 Person p = new Person();
Class cls = p.getClass();
3 Class.forName("java.lang.String");
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也有相应的 Class与之对应。
二、传智播客的反射例子
package cn.itcast.day1; import java.lang.reflect.Array; 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类的字节码只有一份都是相等的 String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1 == cls2); //true System.out.println(cls1 == cls3); //ture System.out.println(cls1.isPrimitive()); //是否为原始类型的字节码(如byte) System.out.println(int.class.isPrimitive()); System.out.println(int.class == Integer.class); System.out.println(int.class == Integer.TYPE); System.out.println(int[].class.isPrimitive()); System.out.println(int[].class.isArray());//是否为数组 //反射相关的构造函数的使用 Constructor constructor1 = String.class.getConstructor(StringBuffer.class); String str2 = (String)constructor1.newInstance(/*"abc"*/new StringBuffer("abc")); System.out.println(str2.charAt(2)); //反射相关的字段的使用 ReflectPoint 类请看 ReflecctPoint.java ReflectPoint pt1 = new ReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); //fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值 System.out.println(fieldY.get(pt1)); Field fieldX = pt1.getClass().getDeclaredField("x");//得到Private的字段 fieldX.setAccessible(true); 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[]{2})); //TestArguments.main(new String[]{"111","222","333"}); String startingClassName = args[0]; Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class); //mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}}); mainMethod.invoke(null, (Object)new String[]{"111","222","333"}); //和数组相关的反射知识 int [] a1 = new int[]{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()); System.out.println(a1.getClass() == a4.getClass()); System.out.println(a1.getClass() == a3.getClass()); System.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[] aObj3 = a1; Object[] aObj4 = a3; Object[] aObj5 = a4; System.out.println(a1); System.out.println(a4); System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); printObject(a4); printObject("xyz"); } /* 若是一个对象则打印它,若是一个数组则打印数组中的每一个元素 */ private static void printObject(Object obj) { Class clazz = obj.getClass(); if(clazz.isArray()){ int len = Array.getLength(obj); for(int i=0;i<len;i++){ System.out.println(Array.get(obj, i)); } }else{ System.out.println(obj); } } private static void changeStringValue(Object obj) throws Exception { Field[] fields = obj.getClass().getFields(); for(Field field : fields){ //if(field.getType().equals(String.class)){ 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); } } }
//ReflectionPoint.java
public class ReflectPoint { private int x; public int y; public String str1 = "ball"; public String str2 = "basketball"; public String str3 = "itcast"; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } }