java 反射

Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructorgetFieldgetMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。ConstructorFieldMethod这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。

反射API的另外一个作用是在运行时刻对一个Java对象进行操作。 这些操作包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现。

今天做了个小示例

 

package com.example;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Example {
    
    /**
     * @param args
     */
    public static void main(String[] args) {        
        try{
            /*
            User user = new User();
            user.setId(1001);
            user.setName("evil rogue studio");
            user.setAge(25);
            */
            Class<?> clazz = Class.forName("com.example.User");
            //Class<?> clazz = new User().getClass();
            
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {  
                System.out.println("方法:"+method);  
            }  
            
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                System.out.println("字段:" + field);
            }
       /**
        * 执行带参数的构造函数来新建实例的方法
        */
       //Constructor cons = clazz.getConstructor(parameterTypes);
       //
User user = (User) cons.newInstance(args);
            User user = (User) clazz.newInstance();
        
            Method method = clazz.getMethod("add",new Class<?>[]{int.class,int.class});  
            int result = (Integer)method.invoke(user, new Object[]{3,9});  
            System.out.println("add 结果:"+result);  
            
            Method method2 = clazz.getDeclaredMethod("sub",new Class<?>[]{int.class,int.class});  
            method2.setAccessible(true);
            int result2 = (Integer)method2.invoke(user, new Object[]{13,9});  
            System.out.println("sub 结果:"+result2);  
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 

 

package com.example;

public class User {

    private long id;
    private String name;
    private int age;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    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;
    }

    /**
     * 加法
     * 
     * @param a
     * @param b
     * @return
     */
    public int add(int a, int b) {
        return a + b;
    }

    /**
     * 减法
     * 
     * @param a
     * @param b
     * @return
     */
    private int sub(int a, int b) {
        return a - b;
    }
}

 

posted @ 2013-01-29 10:34  邪恶痞  阅读(215)  评论(0编辑  收藏  举报