标签:
在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时。两种方式在开发过程中都是十分重要的。在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目。我们经常用new Object()方法来创建实例,而相反的,反射在这个时候就显得突兀,因为有人就会问,Java对象实例的时候为什么不直接new Object就好了呢?其实是情况所迫,有些时候,我们在编译的时候并不知道要什么对象,这个对象的字节码也不知道存在什么地方?是在硬盘,内存,还是遥远的世界另一端的一台电脑中,所以,我们这个时候就用另外一种婉转地方式去编写。
1 String str1 ="abc"; 2 Class cls1 = str1.getClass(); 3 Class cls2 =String.class; 4 Class cls3 =Class.forName("java.lang.String"); 5 System.out.println(str1.getClass()); 6 System.out.println(cls1 == cls2); 7 System.out.println(cls3 == cls2); 8 /** 9 输出结果 10 class java.lang.String 11 true 12 true 13 */
1 System.out.println(int[].class.isPrimitive()); 2 System.out.println(int[].class.isArray());
//得到全部的构造方法 //constructor Constructor[] constuctor =Class.forName("java.lang.String").getConstructors(); //得到参数为StringBuffer的构造方法 Constructor constructor =Class.forName("java.lang.String").getConstructor(StringBuffer.class);
public class ReflectPoint{ //private和public的属性 private int x; public int y; public ReflectPoint(int x,int y){ super(); this.y = y; this.x = x; } publicString toString(){ System.out.println(str1 + str2 + str3); return str1 + str2 + str3; } } //Field ReflectPoint pt1 =newReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); System.out.println(fieldY.get(pt1)); Field fieldX = pt1.getClass().getDeclaredField("x"); fieldX.setAccessible(true); System.out.println(fieldX.get(pt1)); /** 结果: 5 3 */
private static void changeStringValue(Object obj) throws Exception{ // TODO Auto-generated method stub Field[] fields = obj.getClass().getFields(); for(Field field : fields){ if(field.getType()==String.class){ String oldValue =(String) field.get(obj); String newValue = oldValue.replace("a","b"); field.set(obj, newValue); } } }
//Method方法 String str1 = "a"; Method methodCharAt =String.class.getMethod("charAt",int.class); System.out.println(methodCharAt.invoke(str1,1)); //str1是一个String的实例对象
/** * 数组的反射 * @param o1 */ private static void printObject(Object o1){ // TODO Auto-generated method stub Class clazz = o1.getClass(); if(clazz.isArray()){ int length =Array.getLength(o1); for(int i =0; i < length; i++){ System.out.println(Array.get(o1, i)); } }else{ System.out.println(o1); } } int[] a1 =newint[]{1,2,3}; int[] a2 =newint[4]; int[][] a3 =newint[3][4]; String[] a4 =newString[]{"a","b","c"}; printObject(a1); printObject(a4);
String obj =(String)Class.forName("java.lang.String").newInstance();
标签:
原文地址:http://www.cnblogs.com/kgrdomore/p/7b6ed10cf90a0e30776696e3709b0604.html