文档章节

121 项目 018 笔记向 properties 读取工具类

小代码2016
 小代码2016
发布于 2017/02/19 00:08
字数 792
阅读 12
收藏 0

目录结构

└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─laolang
    │  │          └─util
    │  │              └─configfileutils
    │  │                  │  PropertiesUtils.java
    │  │                  │
    │  │                  ├─annotation
    │  │                  │      ConfigurationLocation.java
    │  │                  │      Value.java
    │  │                  │
    │  │                  ├─domain
    │  │                  │      User.java
    │  │                  │
    │  │                  ├─enums
    │  │                  │      ConfigFileType.java
    │  │                  │
    │  │                  └─utils
    │  │                          PropertiesFactory.java
    │  │
    │  └─resources
    │          config.properties
    │
    └─test
        └─java
            └─com
                └─laolang
                    └─util
                        └─configfileutils
                                ConfigFileTypeTest.java
                                ConfigurationLocationTest.java

代码

功能代码

ConfigurationLocation

package com.laolang.util.configfileutils.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ConfigurationLocation {

    public String location();

    public String prefix() default "";
    

}

这个注解主要是配置properties的位置,现在默认在classpath路径下

Value

package com.laolang.util.configfileutils.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Value {
    String value();
}

这个类没用上

###ConfigFileType

package com.laolang.util.configfileutils.enums;


public enum ConfigFileType {
    XML("xml",0),PROPERTIES("properties",1);

    private ConfigFileType( String value, Integer index ){
        this.value = value;
        this.index = index;
    }

    public Integer getIndex() {
        return index;
    }

    public void setIndex(Integer index) {
        this.index = index;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    private Integer index;

    private String value;
}

这个类是标注配置文件类型,也没用上

PropertiesFactory

package com.laolang.util.configfileutils.utils;


import java.io.IOException;
import java.util.Properties;

public class PropertiesFactory {

    public static Properties getProperties( String location ){
        Properties properties = new Properties();
        try {
            properties.load(PropertiesFactory.class.getClassLoader().getResourceAsStream(location));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }
}

这个类是构建一个 Properties

PropertiesUtils

package com.laolang.util.configfileutils;


import com.laolang.util.configfileutils.annotation.ConfigurationLocation;
import com.laolang.util.configfileutils.utils.PropertiesFactory;

import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class PropertiesUtils {

    public static Object getConfigClass(Class<?> clazz) {

        Object object = null;
        try {
            object = clazz.newInstance();

            // 获取 clazz 类标记的所有注解
            Annotation[] annotations = clazz.getAnnotations();

            for (Annotation annotation : annotations) {
                // 如果标记了 ConfigurationLocation 注解
                if (clazz.isAnnotationPresent(ConfigurationLocation.class)) {
                    ConfigurationLocation location = (ConfigurationLocation) annotation;
                    Properties properties = PropertiesFactory.getProperties(location.location());

                    // 得到 clazz 所有申明的字段
                    Field[] fields = clazz.getDeclaredFields();
                    for (Field field : fields) {
                        String value;
                        if( null != location.prefix() && !"".equals(location.prefix())){
                            value = properties.getProperty(location.prefix() + "." + field.getName() );
                        }else{
                            value = properties.getProperty(field.getName());
                        }

                        PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                        // 获得写方法
                        Method method = pd.getWriteMethod();
                        method.invoke(object, getValue(field, value));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        return object;
    }

    /**
     * 根据属性类型得到正确的属性值
     *
     * @param field 字段
     * @param value properties文件中的属性值
     * @return 对应的 Object 对象
     */
    private static Object getValue(Field field, String value) {
        Object val = value;

        String type = String.valueOf(field.getType());
        if( type.contains(" ")){
            type = type.split(" ")[1];
        }
        switch ( type) {
            case "java.lang.String": {
                val = value;
                break;
            }
            case "java.lang.Integer":
            case "int": {
                val = Integer.parseInt(value);
                break;
            }
            case "java.lang.Long":
            case "long": {
                val = Long.parseLong(value);
                break;
            }
            case "java.lang.Float":
            case "float": {
                val = Float.parseFloat(value);
                break;
            }
            case "java.lang.Double":
            case "double": {
                val = Double.parseDouble(value);
                break;
            }
            case "java.lang.Boolean":
            case "boolean": {
                val = Boolean.parseBoolean(value);
            }
        }
        return val;
    }
}

这个类是主要类,使用的时候传入一个类的class就可以了

实体类和properties

User

package com.laolang.util.configfileutils.domain;


import com.laolang.util.configfileutils.annotation.ConfigurationLocation;

@ConfigurationLocation(location = "config.properties")
public class User {

    public User() {
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", id=" + id +
                ", lead=" + lead +
                ", salary=" + salary +
                ", money=" + money +
                ", ageint=" + ageint +
                ", idlong=" + idlong +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public boolean isLead() {
        return lead;
    }

    public void setLead(boolean lead) {
        this.lead = lead;
    }

    public float getSalary() {
        return salary;
    }

    public void setSalary(float salary) {
        this.salary = salary;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }


    public int getAgeint() {
        return ageint;
    }

    public void setAgeint(int ageint) {
        this.ageint = ageint;
    }

    public long getIdlong() {
        return idlong;
    }

    public void setIdlong(long idlong) {
        this.idlong = idlong;
    }

    private String name;

    private String password;

    private Integer age;

    private Long id;

    private boolean lead;

    private float salary;

    private double money;

    private int ageint;

    private long idlong;
}

properties

name=laolang
password=123
age=23
id=1001
lead=false
salary=123.12
money=8000.5
ageint=123321
idlong=123456


测试及结果

ConfigurationLocationTest

package com.laolang.util.configfileutils;


import com.laolang.util.configfileutils.domain.User;
import org.junit.Test;

public class ConfigurationLocationTest {

    @Test
    public void one(){
        User u = (User) PropertiesUtils.getConfigClass(User.class);
        System.out.println(u.toString());
    }
}

结果

User{name='laolang', password='123', age=23, id=1001, lead=false, salary=123.12, money=8000.5, ageint=123321, idlong=123456}

参考

  1. java反射调用get方法和set方法
  2. 深入理解Java:注解(Annotation)基本概念
  3. 深入理解Java:注解(Annotation)自定义注解入门
  4. 深入理解Java:注解(Annotation)--注解处理器
  5. Java 编程思想
  6. LAMP兄弟连视频

© 著作权归作者所有

小代码2016
粉丝 46
博文 328
码字总数 153495
作品 0
安阳
程序员
私信 提问
java.util.Properties*

学习目标: 1、认识properties文件,理解其含义,会正确创建properties文件。 2、会使用java.util.Properties类来操作properties文件。 3、掌握相对路径,能正确书写一个properties文件的相对...

cjun1990
2015/01/16
35
0
自动扫描Properties文件配置的简单实现

最近搞一个简单的Demo项目的时候,需要读取Properties文件中的配置信息,不想一个个文件写代码读取,也不想引入其它庞大的框架来进行自动扫描读取,就自己写了一个简单的自动扫描class目录下...

centychen
2016/10/28
740
0
从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重...

jeffsui
2012/10/31
3.6K
10
Springmvc文件上传

文件上传 一、Springmvc文件上传到ftp服务器 FileServiceImpl: FTPUtil: 上传到ftp服务器的一些配置信息hcxmall.properties: 读取properties文件的工具类: 调用: 二、富文本文件上传 富文...

JS_HCX
2017/11/22
0
0
java中读取配置文件的方法

一、使用org.apache.commons.configuration 需要使用的是jar包:commons-collections-3.2.1.jar、commons-configuration-1.10.jar、commons-lang-2.6.jar和commons-logging-1.2.jar。 可以读......

如风达
2016/08/05
468
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
45分钟前
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
56分钟前
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
59分钟前
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
4
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部