JAVA 反射机制(Java Reflection)总结(二)

来源:互联网 发布:韩顺平java全套视频 编辑:程序博客网 时间:2024/06/05 20:00

利用反射机制,读取配置文件中的相关信息,执行相应的方法

1、新建一个接口
package com.liu.bao;public interface Flower {    void function();    void value();}
2、创建两个实现类
package com.liu.bao;import java.util.Date;public class Jasmine implements Flower{    private double price;    private String colour;    private Date date;    private char discount=1;    private int count=1;//默认值为1    @Override    public void function() {        System.out.println("茉莉花香,雅致清幽");    }    @Override    public void value() {        System.out.println("茉莉花香八折:"+price*count*0.8);    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public String getColour() {        return colour;    }    public void setColour(String colour) {        this.colour = colour;    }    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public char getDiscount() {        return discount;    }    public void setDiscount(char discount) {        this.discount = discount;    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }}
package com.liu.bao;import java.util.Date;public class Rose implements Flower{    private double price;    private String colour;    private Date date;    private char discount=1;    private int count=1;//默认值为1    @Override    public void function() {        System.out.println("七夕之夜,玫瑰之约");    }    @Override    public void value() {        System.out.println("玫瑰之约:"+price*count*0.8);    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public String getColour() {        return colour;    }    public void setColour(String colour) {        this.colour = colour;    }    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public char getDiscount() {        return discount;    }    public void setDiscount(char discount) {        this.discount = discount;    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }}
3、新建一个配置文件
className=com.liu.bao.RoseattName=price/colour/discountattValue=10/white/0method=value
4、测试类
package com.liu.bao;import java.io.FileInputStream;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties;public class TestReflect {    @SuppressWarnings("unchecked")    public static void main(String[] args) throws Exception {        Properties prop = new Properties();        prop.load(new FileInputStream("config.properties")); // 读取配置文件        Class<Flower> clz = (Class<Flower>) Class.forName(prop.getProperty("className")); // 通过反射,获取类,根据配置文件的要求        Flower s = clz.newInstance();  // 创建一个实例,此处用多态        String[] attNames = prop.getProperty("attName").split("/");// 读取配置文件中的属性名        String[] attValues = prop.getProperty("attValue").split("/");// 读取配置文件中的属性值        for (int i = 0; i < attNames.length; i++) {            String methodName = "set" + attNames[i].substring(0, 1).toUpperCase() + attNames[i].substring(1); //拼接SET方法名            Field f = clz.getDeclaredField(attNames[i]); //获取相应字段            Method m = clz.getMethod(methodName,f.getType());  // 获取SET方法(参数类型与字段类型相同)            if (f.getType()==double.class || f.getType().equals(Double.class)) {                m.invoke(s, Double.parseDouble(attValues[i])); // 执行SET方法,将属性注入s实例中。此处需要将配置文件中的属性值转为对应的参数类型            } else if (f.getType().equals(Date.class)) {                m.invoke(s, new SimpleDateFormat("yyy-MM-dd").parse(attValues[i]));            } else if(f.getType()==char.class || f.getType().equals(Character.class)){                m.invoke(s, attValues[i].toCharArray()[0]);            } else if(f.getType()==int.class || f.getType().equals(Integer.class)){                m.invoke(s,Integer.parseInt(attValues[i]));            } else {                m.invoke(s, attValues[i]);            }        }        Method method = clz.getMethod((String) prop.get("method"),null); //获取配置文件中指定的方法        method.invoke(s, null); //执行配置文件中指定的方法    }}