JAVA中的反射机制详解

来源:互联网 发布:怎么从网络电视切换 编辑:程序博客网 时间:2024/06/05 09:16
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。1. 得到某个对象的属性1 public Object getProperty(Object owner, String fieldName) throws Exception {2 Class ownerClass = owner.getClass();3 4 Field field = ownerClass.getField(fieldName);5 6 Object property = field.get(owner);7 8 return property;9 }Class ownerClass = owner.getClass():得到该对象的Class。Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。2. 得到某个类的静态属性 1 public Object getStaticProperty(String className, String fieldName) 2 throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Field field = ownerClass.getField(fieldName); 6 7 Object property = field.get(ownerClass); 8 9 return property;10 }Class ownerClass = Class.forName(className) :首先得到这个类的Class。Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。3. 执行某对象的方法 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { 2 3 Class ownerClass = owner.getClass(); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i ) { 8 argsClass[i] = args[i].getClass(); 9 }10 11 Method method = ownerClass.getMethod(methodName, argsClass);12 13 return method.invoke(owner, args);14 }Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。5~9行:配置参数的Class数组,作为寻找Method的条件。Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。4. 执行某个类的静态方法 1 public Object invokeStaticMethod(String className, String methodName, 2 Object[] args) throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i ) { 8 argsClass[i] = args[i].getClass(); 9 }10 11 Method method = ownerClass.getMethod(methodName, argsClass);12 13 return method.invoke(null, args);14 }基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。5. 新建实例 1 2 public Object newInstance(String className, Object[] args) throws Exception { 3 Class newoneClass = Class.forName(className); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i ) { 8 argsClass[i] = args[i].getClass(); 9 }10 11 Constructor cons = newoneClass.getConstructor(argsClass);12 13 return cons.newInstance(args);14 15 }这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。第5~第9行:得到参数的Class数组。Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。cons.newInstance(args):新建实例。6. 判断是否为某个类的实例1 public boolean isInstance(Object obj, Class cls) {2 return cls.isInstance(obj);3 }7. 得到数组中的某个元素1 public Object getByArray(Object array, int index) {2 return Array.get(array,index);3 }
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 烟囱倒灌怎么办 防火泥流油怎么办 tsa海关锁打不开怎么办 耐火泥太稀了怎么办 集装箱封条锁没加怎么办 货车门漏水怎么办 硅胶笼布粘馒头怎么办 优思明忘吃两天怎么办 烘干机衣服缩水怎么办 妈富隆月经不停怎么办 高温笔遇冷还原怎么办 在拉萨胸闷怎么办 vgm忘记报柜重怎么办 lng漏气怎么办 lng阀漏气怎么办 装修动火证怎么办? 门窗资质怎么办多少钱 消防管卡箍漏水怎么办 消防开关漏水怎么办 消防水管渗透怎么办 铁管道丝扣漏水怎么办 pscc2015卸载失败怎么办 硬币被醋泡红了怎么办 小区水泵噪音怎么办 水池子漏水怎么办 预埋板遇砖墙怎么办 厌氧池污泥上浮怎么办 二楼厕所反水怎么办 晋城文景苑二期怎么办 小说找不到资源怎么办 读书很慢怎么办 楼房屋面漏水怎么办 液化气罐起火怎么办 液化气闻到漏气怎么办 打火灶打不着火怎么办 住高层着火怎么办 被清退了怎么办 盖房西边火道大怎么办 买房子没钱怎么办 车祸死者家属怎么办 武进图书馆怎么办卡