java反射机制

北城余情 提交于 2020-03-28 08:22:56

转自 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("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
            System.out.println("调用 getProperty 方法,获取Student类的所有属性");
            getProperty(stu);
            
            
            //获取反射类的某个属性值
            System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
            System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
            getProperty(objStu,"NAME");
            
            
            //获取反射类的所有方法
            System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
            System.out.println("调用 getMethods 方法,获取Student类的所有方法");
            getMethods(stu);
            
            //执行反射类的getInfo方法
            System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
            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("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+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;
    }
    
}

运行结果:

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!