免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1511 | 回复: 0

java反射的例子 [复制链接]

论坛徽章:
0
发表于 2009-06-15 09:55 |显示全部楼层

Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
个人理解就是在运行时可以得到某个对象的所有信息,包括方法,类型,属性,方法参数,方法返回值以及可以调用该类的所有方法。
下面是两个例子:
Java代码
[/url]
  • package cn.test;   
  •   
  •   
  • import java.lang.reflect.Array;   
  • import java.lang.reflect.Constructor;   
  • import java.lang.reflect.Field;   
  • import java.lang.reflect.Method;   
  •   
  •   
  • /**
  • * Java Reflection Cookbook
  • *
  • * @author Michael Lee
  • * @since 2006-8-23
  • * @version 0.1a
  • */  
  •   
  • public class TestReflection {   
  •     /**
  •      * 得到某个对象的公共属性
  •      *
  •      * @param owner, fieldName
  •      * @return 该属性对象
  •      * @throws Exception
  •      *
  •      */  
  •     public Object getProperty(Object owner, String fieldName) throws Exception {   
  •         Class ownerClass = owner.getClass();   
  •   
  •         Field field = ownerClass.getField(fieldName);   
  •   
  •         Object property = field.get(owner);   
  •   
  •         return property;   
  •     }   
  •   
  •     /**
  •      * 得到某类的静态公共属性
  •      *
  •      * @param className   类名
  •      * @param fieldName   属性名
  •      * @return 该属性对象
  •      * @throws Exception
  •      */  
  •     public Object getStaticProperty(String className, String fieldName)   
  •             throws Exception {   
  •         Class ownerClass = Class.forName(className);   
  •   
  •         Field field = ownerClass.getField(fieldName);   
  •   
  •         Object property = field.get(ownerClass);   
  •   
  •         return property;   
  •     }   
  •   
  •   
  •     /**
  •      * 执行某对象方法
  •      *
  •      * @param owner
  •      *            对象
  •      * @param methodName
  •      *            方法名
  •      * @param args
  •      *            参数
  •      * @return 方法返回值
  •      * @throws Exception
  •      */  
  •     public Object invokeMethod(Object owner, String methodName, Object[] args)   
  •             throws Exception {   
  •   
  •         Class ownerClass = owner.getClass();   
  •   
  •         Class[] argsClass = new Class[args.length];   
  •   
  •         for (int i = 0, j = args.length; i
  •             argsClass = args.getClass();   
  •         }   
  •   
  •         Method method = ownerClass.getMethod(methodName, argsClass);   
  •   
  •         return method.invoke(owner, args);   
  •     }   
  •   
  •   
  •       /**
  •      * 执行某类的静态方法
  •      *
  •      * @param className
  •      *            类名
  •      * @param methodName
  •      *            方法名
  •      * @param args
  •      *            参数数组
  •      * @return 执行方法返回的结果
  •      * @throws Exception
  •      */  
  •     public Object invokeStaticMethod(String className, String methodName,   
  •             Object[] args) throws Exception {   
  •         Class ownerClass = Class.forName(className);   
  •   
  •         Class[] argsClass = new Class[args.length];   
  •   
  •         for (int i = 0, j = args.length; i
  •             argsClass = args.getClass();   
  •         }   
  •   
  •         Method method = ownerClass.getMethod(methodName, argsClass);   
  •   
  •         return method.invoke(null, args);   
  •     }   
  •   
  •   
  •   
  •     /**
  •      * 新建实例
  •      *
  •      * @param className
  •      *            类名
  •      * @param args
  •      *            构造函数的参数
  •      * @return 新建的实例
  •      * @throws Exception
  •      */  
  •     public Object newInstance(String className, Object[] args) throws Exception {   
  •         Class newoneClass = Class.forName(className);   
  •   
  •         Class[] argsClass = new Class[args.length];   
  •   
  •         for (int i = 0, j = args.length; i
  •             argsClass = args.getClass();   
  •         }   
  •   
  •         Constructor cons = newoneClass.getConstructor(argsClass);   
  •   
  •         return cons.newInstance(args);   
  •   
  •     }   
  •   
  •   
  •       
  •     /**
  •      * 是不是某个类的实例
  •      * @param obj 实例
  •      * @param cls 类
  •      * @return 如果 obj 是此类的实例,则返回 true
  •      */  
  •     public boolean isInstance(Object obj, Class cls) {   
  •         return cls.isInstance(obj);   
  •     }   
  •       
  •     /**
  •      * 得到数组中的某个元素
  •      * @param array 数组
  •      * @param index 索引
  •      * @return 返回指定数组对象中索引组件的值
  •      */  
  •     public Object getByArray(Object array, int index) {   
  •         return Array.get(array,index);   
  •     }   
  • }  package cn.test;
    import java.lang.reflect.Array;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    /**
    * Java Reflection Cookbook
    *
    * @author Michael Lee
    * @since 2006-8-23
    * @version 0.1a
    */
    public class TestReflection {
        /**
         * 得到某个对象的公共属性
         *
         * @param owner, fieldName
         * @return 该属性对象
         * @throws Exception
         *
         */
        public Object getProperty(Object owner, String fieldName) throws Exception {
            Class ownerClass = owner.getClass();
            Field field = ownerClass.getField(fieldName);
            Object property = field.get(owner);
            return property;
        }
        /**
         * 得到某类的静态公共属性
         *
         * @param className   类名
         * @param fieldName   属性名
         * @return 该属性对象
         * @throws Exception
         */
        public Object getStaticProperty(String className, String fieldName)
                throws Exception {
            Class ownerClass = Class.forName(className);
            Field field = ownerClass.getField(fieldName);
            Object property = field.get(ownerClass);
            return property;
        }
        /**
         * 执行某对象方法
         *
         * @param owner
         *            对象
         * @param methodName
         *            方法名
         * @param args
         *            参数
         * @return 方法返回值
         * @throws Exception
         */
        public Object invokeMethod(Object owner, String methodName, Object[] args)
                throws Exception {
            Class ownerClass = owner.getClass();
            Class[] argsClass = new Class[args.length];
            for (int i = 0, j = args.length; i
    Java代码
    [url=http://canofy.javaeye.com/blog/359565#]

  • package cn.test;   
  •   
  • import java.lang.reflect.Field;   
  • import java.lang.reflect.InvocationTargetException;   
  • import java.lang.reflect.Method;   
  • import java.util.ArrayList;   
  •   
  • import cn.IpUtils.IpBean;   
  •   
  • public class TestObject {   
  •       
  •     /**
  •      * 设置属性值
  •      * @param list
  •      * @param cla
  •      * @return
  •      */  
  •     public ArrayList array2bean(ArrayList list, Class cla) {   
  •         ArrayList result = new ArrayList();   
  •         int filed_len = cla.getDeclaredFields().length;   
  •         System.out.println(":"+cla.getDeclaredFields().length);   
  •         for (int i = 0; i
  •             Object[] o = (Object[]) list.get(i);   
  •             int length = filed_len
  •             try {   
  •                 result.add(cla.newInstance());   
  •                 for (int j = 0; j
  •                     Method m = null;   
  •                     String mName =cla.getDeclaredFields()[j].getName();   
  •                     mName = mName.substring(0, 1).toUpperCase()+ mName.substring(1);   
  •                     mName = "set" + mName;   
  •                     m = cla.getMethod(mName, new Class[] { String.class });   
  •                     //调用设置的方法,给属性赋值   
  •                     m.invoke(result.get(i), new Object[] { o[j] == null ? "": o[j].toString() });   
  •                 }   
  •             } catch (Exception e) {   
  •                 e.printStackTrace();   
  •             }   
  •         }   
  •         return result;   
  •     }   
  •       
  •     /**
  •      * 获取get的取值
  •      * @param obj
  •      * @return
  •      * @throws Exception
  •      */  
  •     public String getObjectToString(Object obj) throws Exception{   
  •         Class cla=obj.getClass();   
  •         Method[] ma=cla.getDeclaredMethods();//获取所有声明的方法数组   
  •         Method method=null;   
  •         String methodName=null;   
  •         Object returnValue=null;   
  •         for(int i=0;i
  •             method=ma;   
  •             methodName=method.getName();//方法名   
  •             if(methodName.indexOf("get")==0){//以get开始的方法,排除set方法   
  •                 returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象   
  •                 System.out.print(methodName+"::");   
  •                 System.out.println(returnValue==null?"":returnValue.toString());   
  •             }   
  •         }         
  •         return "";   
  •     }   
  •   
  •     /**
  •      * 获取对象的属性值,含有get方法的
  •      * @param obj
  •      * @return
  •      * @throws NoSuchMethodException  
  •      * @throws SecurityException  
  •      * @throws InvocationTargetException  
  •      * @throws IllegalAccessException  
  •      * @throws IllegalArgumentException  
  •      */  
  •     public String getAttributeValue(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{   
  •         Class cla=obj.getClass();   
  •         Field[] fds=cla.getDeclaredFields();   
  •         Field field=null;   
  •         String fieldName=null;   
  •         String methodName=null;   
  •         Method method=null;   
  •         Object returnValue=null;   
  •         for(int i=0;i
  •             field=fds;   
  •             fieldName=field.getName();   
  •             methodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);               
  •             method=cla.getDeclaredMethod(methodName, null);   
  •             returnValue=method.invoke(obj, null);//调用方法,相当于执行get方法得到的结果,这里返回的是一个对象   
  •             System.out.print(methodName+"::");   
  •             System.out.println(returnValue==null?"":returnValue.toString());   
  •         }   
  •            
  •         return "";   
  •     }   
  •       
  •     /**
  •      * @param args
  •      * @throws Exception  
  •      */  
  •     public static void main(String[] args) throws Exception {   
  • //      IpBean.class   
  •         TestObject to=new TestObject();   
  •         IpBean ib=new IpBean();   
  •         ib.setFrom("from1");   
  •         ib.setPosition("position1");   
  •         ib.setTo("to1");   
  •         ib.setId(10);   
  •         to.getObjectToString(ib);   
  • //      to.getAttributeValue(ib);   
  •     }   
  •   
  • }  package cn.test;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import cn.IpUtils.IpBean;
    public class TestObject {
           
            /**
             * 设置属性值
             * @param list
             * @param cla
             * @return
             */
            public ArrayList array2bean(ArrayList list, Class cla) {
                    ArrayList result = new ArrayList();
                    int filed_len = cla.getDeclaredFields().length;
                    System.out.println(":"+cla.getDeclaredFields().length);
                    for (int i = 0; i
    Java代码
    [/url]
  • package cn.IpUtils;   
  •   
  • public class IpBean {   
  •     private String from; // IP段起始   
  •     private String to; // IP结束   
  •     private String position; // 地理名称       
  •     private int id = 0;   
  •   
  •     public String getFrom() {   
  •         return from;   
  •     }   
  •   
  •     public void setFrom(String from) {   
  •         this.from = from;   
  •     }   
  •   
  •     public String getTo() {   
  •         return to;   
  •     }   
  •   
  •     public void setTo(String to) {   
  •         this.to = to;   
  •     }   
  •   
  •     public String getPosition() {   
  •         return position;   
  •     }   
  •   
  •     public void setPosition(String position) {   
  •         this.position = position;   
  •     }   
  •   
  •     public int getId() {   
  •         return id;   
  •     }   
  •   
  •     public void setId(int id) {   
  •         this.id = id;   
  •     }   
  •   
  •       
  • }  package cn.IpUtils;
    public class IpBean {
            private String from; // IP段起始
        private String to; // IP结束
        private String position; // 地理名称   
        private int id = 0;
            public String getFrom() {
                    return from;
            }
            public void setFrom(String from) {
                    this.from = from;
            }
            public String getTo() {
                    return to;
            }
            public void setTo(String to) {
                    this.to = to;
            }
            public String getPosition() {
                    return position;
            }
            public void setPosition(String position) {
                    this.position = position;
            }
            public int getId() {
                    return id;
            }
            public void setId(int id) {
                    this.id = id;
            }
           
    }


    本文来自ChinaUnix博客,如果查看原文请点:[url]http://blog.chinaunix.net/u1/57965/showart_1964357.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP