java反射的使用
Java反射机制主要提供了下面功能: 在执行时推断随意一个对象所属的类。在执行时构造随意一个类的对象;在执行时推断随意一个类所具有的成员变量和方法;在执行时调用随意一个对象的方法。生成动态代理。
以下介绍下java反射机制的使用
package cn.csdn.reflect; import java.awt.Button; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedList; public class ReflectClass { //參考地址 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html public void geteClassBegin(){ Demo demo = new Demo(); System.out.println(demo.getClass().getSuperclass()); String str = "23432";; System.out.println(str.getClass()); // getClass java.lang.String class .getSuperclass() java.lang.Object Button b = new Button(); System.out.println(b.getClass().getSuperclass().getSuperclass()); System.out.println(Boolean.TYPE); LinkedList linkedList = new LinkedList(); System.out.println(linkedList.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass()); } //3种不同的方法获取类名 public void getClassMethod(){ try { //鉴于使用这样的方式 Class<?> demo = Class.forName("cn.csdn.reflect.Demo"); System.out.println(demo.getName()); Class<?> demo1 = Demo.class; System.out.println(demo1.getName()); Class<?> demo2 = new Demo().getClass(); System.out.println(demo2.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //通过无參构造实例化对象 -- Demo public void getNewClass(){ try { Class<?> clas = Class.forName("cn.csdn.reflect.Demo"); Demo demo = (Demo)clas.newInstance(); demo.setAddress("黑悲伤"); demo.setEmail("sdfdsf@qq.com"); System.out.println(demo.toString()); } catch (Exception e) { e.printStackTrace(); } } //获取类中全部的构造函数 --Demo1 public void getConstructor() throws Exception{ Class<?> clas = Class.forName("cn.csdn.reflect.Demo1"); Constructor<?
> cons[] = clas.getConstructors(); for(Constructor<?> con:cons){ System.out.println(con); } } //class 获取一个类的全部框架 ---- Demo1的属性 本类属性的获取和父类的全部public的获取 public void getClassAll() throws Exception{ Class<?> clas = Class.forName("cn.csdn.reflect.Demo1"); //获取Demo1的全部属性及类型 // getDeclaredFields 获取这个类的全部属性字段 包含 private public proteced Field[] fields = clas.getDeclaredFields(); for(Field field:fields){ //System.out.println(field); int modifier = field.getModifiers(); String str = Modifier.toString(modifier); //输出值如: private java.lang.Integer id System.out.println(str+"========="+field.getType().getName()+"======"+field.getName()); } //getFields 获取 本类及父类的全部public的方法 仅仅有public的方法 Field[] fields1 = clas.getFields(); for(Field field:fields1){ System.out.println(field); int mo = field.getModifiers(); String str = Modifier.toString(mo); System.out.println(str+" "+field.getType().getName()+" "+field.getName()); } } //通过反射调用其它类中的方法 public void getMethod() throws Exception{ Class<?> clas = Class.forName("cn.csdn.reflect.Demo1"); //调用Demo1类中的方法 hello Method method = clas.getMethod("hello"); //对方法进行实例化 method.invoke(clas.newInstance()); } //调用get set 方法 public void getSetMethod() throws Exception{ Class<?> clas = Class.forName("cn.csdn.reflect.Demo1"); Object obj = clas.newInstance(); Method method = clas.getMethod("getId"); System.out.println(method.invoke(obj)); } //通过反射操作属性 给属性设置值 假设此属性是私有的。则必须加上setAccessible 假设为共同拥有的 则不用考虑 public void getOperateAttribute() throws Exception{ Class<?> clas = Class.forName("cn.csdn.reflect.Demo1"); Object obj = clas.newInstance(); Field field = clas.getDeclaredField("name"); //此属性为私有变量的时候必需要做此操作 才干够通过訪问,否则会报错 java.lang.IllegalAccessException: Class cn.csdn.reflect.ReflectClass can not access a member of class cn.csdn.reflect.Demo1 with modifiers "private" field.setAccessible(true); field.set(obj,"张三"); System.out.println(field.get(obj)); //输出结果:张三 } //通过反射类中的Array能够得到数据的信息并能够改动数组的大小 public void getArrayAttribute() throws Exception{ int[] array = {1,2,3,4,5}; Class<?> demo = array.getClass().getComponentType(); System.out.println("数组的类型:"+demo.getName()+"====数组的长度:"+Array.getLength(array)+"=获取数组的第一个元素="+Array.get(array, 0)); Array.set(array,0,100); System.out.println(Array.get(array, 0)); //输出结果: //数组的类型:int====数组的长度:5=获取数组的第一个元素=1 //100 } //改动数组的大小 Array.newInstance()方法 public void getArrayLength() throws Exception{ int[] array={1,2,3,4,5,6,7,8,9}; //改动数组大小之前的循环输出 for(int i = 0;i<Array.getLength(array);i++){ if(i==(Array.getLength(array)-1)){ System.out.println(); }else{ System.out.print(Array.get(array, i)+" "); } } // 输出 1 2 3 4 5 6 7 8 Class<?> demo = array.getClass().getComponentType(); Object arrayNew = Array.newInstance(demo, 15); int length = Array.getLength(array); //System.arraycopy()实现数组之间的复制 //arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组 srcPos:源数字開始复制的位置 //dest 目的数组 (arrayNew) destPos:目的数组存在的起始位置 length是复制的长度 System.arraycopy(array, 0, arrayNew, 0, length); System.out.println("改动之后的长度为==="+Array.getLength(arrayNew));//15 for(int i = 0;i<Array.getLength(arrayNew);i++){ System.out.print(Array.get(arrayNew, i)+" "); } //1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 } //通过反射得到实体类相应的值 public void getValue() throws Exception{ //getFields 获取 本类及父类的全部public的方法 仅仅有public的方法 // field.get()能够得到相应的实体类中的值 Class<?
> clas = Class.forName("cn.csdn.reflect.Demo1"); Demo1 demo = (Demo1) clas.newInstance(); demo.setAddress("2332"); demo.setEmail("342"); Field[] fields1 = clas.getFields(); for(Field field:fields1){ int mo = field.getModifiers(); String str = Modifier.toString(mo); System.out.println(str+" "+field.getType().getName()+" "+field.getName()+"=="+field.get(demo)); } //输出结果: /* * public java.lang.String phone==null public java.lang.String address==2332 public java.lang.String email==342 */ } public void getCase() throws Exception{ //实例介绍 当想要同一时候获取一个对象在改动前和改动后的值的时候,可用到反射 Demo before = null; //获取改动前的对象 Demo1 vo = null;//获取改动之后的对象 Class beforeClazz = before.getClass(); Method[] beforeMethods = beforeClazz.getMethods(); for (Method method : beforeMethods) { //通过之前的对象获取相应的值 Object beforeValue = method.invoke(before); //获取改动之后的值 Object afterValue = method.invoke(vo); } } }