@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Value {
String value();
}
public interface IConfig {
@Value("db.url")
String dbUrl();
@Value("db.validation")
boolean isValidated();
@Value("db.pool.size")
int poolSize();
}
public final class ConfigFactory {
private ConfigFactory(){}
public static IConfig create(final InputStream is) throws IOException{
final Properties properties = new Properties();
properties.load(is);
return (IConfig) Proxy.newProxyInstance(IConfig.class.getClassLoader(), new Class[]{IConfig.class}, new PropertyMapper(properties));
}
public static final class PropertyMapper implements InvocationHandler {
private final Properties properties;
public PropertyMapper(Properties properties){
this.properties = properties;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
final Value value = method.getAnnotation(Value.class);
if(null == value){
return null;
}
String property = properties.getProperty(value.value());
if(null == property){
return null;
}
final Class<?> returns = method.getReturnType();
if(returns.isPrimitive()){
if (int.class.equals(returns)) {
return Integer.valueOf(property);
} else if(long.class.equals(returns)){
return Long.valueOf(property);
} else if(double.class.equals(returns)){
return Double.valueOf(property);
} else if(float.class.equals(returns)){
return Float.valueOf(property);
} else if(boolean.class.equals(returns)){
return Boolean.valueOf(property);
}
}
return property;
}
}
public static void main(String[] args) throws FileNotFoundException, IOException {
IConfig config = ConfigFactory.create(new FileInputStream("E:\\aopen\\config.properties"));
String dbUrl = config.dbUrl();
boolean isLoginValidated = config.isValidated();
int dbPoolSize = config.poolSize();
System.out.println(dbUrl);
System.out.println(isLoginValidated);
System.out.println(dbPoolSize);
}
}