zoukankan      html  css  js  c++  java
  • java反射机制

    转自 http://blog.csdn.net/xiaoxian8023 

     Java反射机制

        JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

        JAVA反射应用

        Java反射机制主要提供了以下功能: 

    1. 在运行时判断任意一个对象所属的类;
    2. 在运行时构造任意一个类的对象;
    3. 在运行时判断任意一个类所具有的成员变量和方法;
    4. 在运行时调用任意一个对象的方法;
    5. 生成动态代理。

    常用方法

    ①. 判断对象是否属于反射得到的类(isInstance)

    class S { 
    }  
    public class IsInstance { 
       public static void main(String args[]) { 
          try { 
               Class cls = Class.forName("S"); 
               boolean b1 = cls.isInstance(new Integer(37)); 
               System.out.println(b1); 
               boolean b2 = cls.isInstance(new S()); 
               System.out.println(b2); 
          } 
          catch (Throwable e) { 
               System.err.println(e); 
          } 
       } 
    }

    在这个例子中创建了一个S 类的 Class 对象,然后检查一些对象是否是S的实例。结果输出false和true。说明Integer(37) 不是,但 new S()是。

    ②. 获取某个反射类的所有属性字段

        /**
         * 获取反射类的所有属性字段
         * 
         * @param ownerClass 反射的类
         * @return
         * @throws Exception
         */
        public Field[] getProperty(Class ownerClass) throws Exception {
    
            //获取该类所有属性字段
            //Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)
            Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类)
            
            //输出所有属性字段
            for(int i=0;i<fields.length;i++){
                System.out.println("属性:"+fields[i]);
            }
    
            return fields;
        }

    ③. 获取反射类的某个public属性值

        /**
         * 获取反射类的某个public属性值
         * 
         * @param ownerClass 反射的类
         * @param 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);
            
            //输出该属性信息
            System.out.println(fieldName+"的属性值:"+property.toString());
    
            return property;
    
        }

    ④.获取反射类的该中的所有方法

        /**
         * 获取反射类的该中的所有方法
         * @param ownerClass 反射的类
         * @return
         * @throws Exception
         */
        public Method[] getMethods(Class ownerClass) throws Exception {
    
            //获取该类所有方法
            //Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)
            Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类)
    
            //输出所有方法
            for(int i=0;i<methods.length;i++){
                System.out.println("方法:" +methods[i]);
            }
    
            return methods;
        }

    ⑤. 执行反射类的该类中的某个方法

        /**
         * 执行反射类的该中的某个方法
         * @param ownerClass 反射的类
         * @param methodName 方法名
         * @return
         * @throws Exception
         */
        public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception {
    
            //得到对象所属类
            Class ownerClass = owner.getClass();
    
            //获取该类的某个方法
            Method method = ownerClass.getMethod(methodName, null);
            
            //执行某个对象的方法
            Object result = method.invoke(owner, args);
            
            //输出结果信息
            System.out.println("结果返回值:"+ result);
    
            return result;
        }

    实例演示方法:

        /**
         * 测试反射常用方法
         */
        public void refTest(){
            String className = "com.java.reflecttest.Student";
    
            try {
                
                //通过反射机制,使用类装载器,装载该类
                Class<?> stu = Class.forName(className);
                Object objStu = stu.newInstance();
                        
                
                //获取反射类的所有属性
                System.out.println("
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ");
                System.out.println("调用 getProperty 方法,获取Student类的所有属性");
                getProperty(stu);
                
                
                //获取反射类的某个属性值
                System.out.println("
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ");
                System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
                getProperty(objStu,"NAME");
                
                
                //获取反射类的所有方法
                System.out.println("
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ");
                System.out.println("调用 getMethods 方法,获取Student类的所有方法");
                getMethods(stu);
                
                //执行反射类的getInfo方法
                System.out.println("
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ");
                System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");
                invokeMethod(objStu, "getInfo", null);
                
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    演示所用的Student类 

    package com.java.reflecttest;
    
    /**
     * 学生信息类
     * 
     * @author Longxuan
     *
     */
    public class Student {
    
        /**
         * 学号
         */
        private String stuId ;
        
        /**
         * 学号
         */
        public String STUID;
        
        /**
         * 姓名
         */
        private String name ;
        
        /**
         * 姓名
         */
        public String NAME;
    
        /**
         * 年龄
         */
        private int age;
        
        /**
         * 年龄
         */
        public int AGE;
        
        /**
         * 班级
         */
        private String classid;
        
    
    
        
        public String getStuId() {
            return stuId;
        }
    
        public void setStuId(String stuId) {
            this.stuId = stuId;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getClassid() {
            return classid;
        }
    
        public void setClassid(String classid) {
            this.classid = classid;
        }
        
        
        /**
         * 输出学生信息
         */
        public void getInfo(){
            System.out.println("学生信息:
    学号:"+stuId+"	姓名:"+name+"	年龄:"+age+"	班级:"+classid);
        }
        
        /**
         * 构造函数
         */
        public Student(){
            init();
        }
        
        
        /**
         * 私有初始化方法
         */
        private void init(){
            this.name = "张三";
            this.stuId ="1001";
            this.age = 14;
            this.classid = "A001";
            this.NAME = name;
            this.AGE = age;
            this.STUID = stuId;
        }
        
    }

    运行结果:

  • 相关阅读:
    Using PL/SQL Control Structures
    Oracle JDBC
    PL/SQL 命名规则
    PL/SQL User's Guide and Reference:PL/SQL Architecture
    JAVA中调用存储过程和函数
    Oracle正则表达式
    java根据网卡名称获取IP
    开放通知接口,执行文件同步操作
    Jquery UI Dialog Demo
    esapi2.0GA.jar的license
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/5509207.html
Copyright © 2011-2022 走看看