您的位置:首页 > 编程语言 > Java开发

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

2017-08-26 17:50 615 查看
利用反射机制,读取配置文件中的相关信息,执行相应的方法

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();
pr
abe4
op.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); //执行配置文件中指定的方法
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: