java反射的使用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java反射的使用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6123字,纯文字阅读大概需要9分钟。
内容图文
![java反射的使用](/upload/InfoBanner/zyjiaocheng/1123/7c013d1b98b94cfdb607a47caf4790e5.jpg)
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); } } }
原文:http://blog.csdn.net/hanxiaoshuang123/article/details/37877231
内容总结
以上是互联网集市为您收集整理的java反射的使用全部内容,希望文章能够帮你解决java反射的使用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。