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

学习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();
        }



    }
}
运行结果如下

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







猜你喜欢

转载自blog.csdn.net/varissss/article/details/78821106