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

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

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.Rose
attName=price/colour/discount
attValue=10/white/0
method=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); //执行配置文件中指定的方法
    }

}

猜你喜欢

转载自blog.csdn.net/every__day/article/details/77604409