(浅谈)Java反射机制的使用

来源:互联网 发布:无印良品文具淘宝 编辑:程序博客网 时间:2024/05/19 19:44

学习J2ee开发框架的时候总能听说反射机制,比如spring框架,Aop中的动态代理等,就在网上查找了很多关于反射的文章,每篇文章中都会关于反射机制有大量的解释,看过之后觉得明白很多,但是还是有很多说不出来的疑惑,直到给同学讲解反射的时候,她问:我们正常写代码的时候哪里用的上反射。我才觉得我在编写的程序时很难想到用反射区编写,所以我就写了一个小例子,希望对有同样疑惑的人有帮助。

我就拿最简单的加减乘除计算器举例
正常我们写意个计算类
public class jisuan {    private int num1;    private int num2;    public int getNum1() {        return num1;    }    public void setNum1(int num1) {        this.num1 = num1;    }    public int getNum2() {        return num2;    }    public void setNum2(int num2) {        this.num2 = num2;    }    public String getOperater() {        return operater;    }    public void setOperater(String operater) {        this.operater = operater;    }    private String operater;    public int add(){        System.out.println("diaoyong add");        return num1+num2;    }    public int sub(){        System.out.println("diaoyong sub");        return num1+num2;    }    public int cheng(){        System.out.println("diaoyong cheng");        return num1*num2;    }    public int chu(){        System.out.println("diaoyong chu");        if(num2!=0){            return num1/num2;        }else            return 0;    }}
再编写一个主程序调用
public class Test{    public static void main(String[]args){        jisuan test=new jisuan();        Scanner sc=new Scanner(System.in);        System.out.println("请输入第一个数");        int num1=Integer.parseInt(sc.nextLine());        test.setNum1(num1);        System.out.println("请输入第二个数");        int num2=Integer.parseInt(sc.nextLine());        test.setNum2(num2);        System.out.println("请输入运算符");        String operter=sc.nextLine();        switch (operter){            case "add":                System.out.println(test.add());                break;            case "sub":                System.out.println(test.sub());                break;            case "cheng":                System.out.println(test.cheng());                break;            case "chu":                System.out.println(test.chu());                break;        }    }}
我们会用switch语句来调用相应的方法,但是如果使用反射机制,就可以再运行时通过输入的运算符直接调用方法
下面是使用反射机制实现的

import java.util.Scanner;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Test {    public static void main(String[] args) {        try {            //通过反射得到jisuan整个类            Class c = Class.forName("jisuan");            //使用Class类的newInstance()方法创建类的一个对象            Object test = c.newInstance();            //得到jisuan类中的所有非私有方法            Method[] method=c.getMethods();            for(Method me:method){                System.out.println(me.getName()+"  ");            }            //得到jisuan类的所有非私有属性            Field[] fields =c.getFields();            for(Field f:fields){                System.out.println(f.getName()+"  ");            }            Scanner sc=new Scanner(System.in);            System.out.println("请输入第一个数");            int num1=Integer.parseInt(sc.nextLine());            //获取setNum1方法(Class.getDeclaredMethod()获取指定方法)            Method setNum1=c.getDeclaredMethod("setNum1",int.class);            //执行setNum1方法,第一个参数是操作对象,后面是传的值            setNum1.invoke(test,num1);            System.out.println("请输入第二个数");            int num2=Integer.parseInt(sc.nextLine());            Method setNum2=c.getDeclaredMethod("setNum2",int.class);            setNum2.invoke(test,num2);            System.out.println("请输入运算符");            String operater=sc.nextLine();            //最后通过输入的运算符获取方法,不用switch            Method setOperater=c.getDeclaredMethod(operater);            System.out.println(setOperater.invoke(test));        }catch(Exception e){            e.printStackTrace();        }    }}
运行结果如下

通过这种小的实例能看出,反射会让我们的代码更灵活。
希望能给你带来帮助!!







原创粉丝点击