java自动赋值_java反射机制实现属性文件中配置自动赋值到对象中

博客介绍客户端与服务端通过socket通信的功能需求,提出将数据库连接配置信息写在配置文件中,读取文件并自动为服务器连接对象的成员变量赋值。详细展示了使用Java反射机制实现该功能的代码,包括定义服务器地址对象、处理字符串首字母大写及在静态代码块中完成赋值操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能需求:

客户端、服务端通过socket通信发送信息,本机模拟服务端,开启端口号为0000的socket,用于接收客户端发送的数据,客户端向服务端发送数据并获取服务端返回的数据。

功能实现很简单,但是现在想把关于数据库连接的一些配置信息,比如数据库地址(本机为127.0.0.1),端口号(本机为0000),超时时间,缓冲区大小等等配置写在一个配置文件中,然后读取这个配置文件,创建一个服务器连接对象,将这些信息都作为对象的成员变量,从配置文件中读取数据并自动为所有成员变量赋值。

下面的实现用到了java的反射机制。

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Properties;

/**

* 定义服务器地址对象,从指定目录的配置文件中读取服务器地址/端口号/超时时间/字符缓冲区大小/超时等待时间

*

* @author jwenjian

*

*/

public class ServerAddress {

/*

* 注意:

* 1 成员变量定义为public static 方便调用时直接用类名.成员变量访问;为其设置getter/setter方法,为了在静态代码块中为其赋值

* 2 定义成员变量时,基本数据类型要使用其包装类来声明,如:int=〉Integer,类型转换时需要调用Integer.valueOf(String arg0)的方法,而int没有这个方法

* 3 成员变量必须在配置文件中有对应的数据

*/

public static String address;

public static Integer port;

public static Integer conntimeout;

public static Integer timeout;

public static Integer buffsize;

public static String getAddress() {

return address;

}

public static void setAddress(String address) {

ServerAddress.address = address;

}

public static int getPort() {

return port;

}

public static void setPort(Integer port) {

ServerAddress.port = port;

}

public static int getConntimeout() {

return conntimeout;

}

public static void setConntimeout(Integer conntimeout) {

ServerAddress.conntimeout = conntimeout;

}

public static int getTimeout() {

return timeout;

}

public static void setTimeout(Integer timeout) {

ServerAddress.timeout = timeout;

}

public static int getBuffsize() {

return buffsize;

}

public static void setBuffsize(Integer buffsize) {

ServerAddress.buffsize = buffsize;

}

/**

* 将字符串首字母大写

* @param input 待处理的字符串

* @return首字母大写处理后的字符串

*/

public static String firstLetterToUpCase(String input) {

String firstLetter = input.substring(0, 1);

return firstLetter.toUpperCase() + input.substring(1, input.length());

}

static {

Properties properties = new Properties();

try {

InputStream in = new FileInputStream(

".\\config\\Client\\serverAddress.properties");

properties.load(in);

//利用java反射机制来获取ServerAddress的class

Class clazz = Thread

.currentThread()

.getContextClassLoader()

.loadClass(

"connectionHelper.ServerAddress");

//通过clazz创建ServerAddress的实例

ServerAddress sa = (ServerAddress) clazz.newInstance();

//获取所有的成员变量

Field[] fields = clazz.getDeclaredFields();

//为成员变量遍历赋值

for (Field field : fields) {

//获取对应的成员变量的set方法:getDeclaredMethod(String arg0,Class arg1)的第二个参数,通过field.getType()动态调用成员变量对应的set方法

Method method = clazz

.getDeclaredMethod("set" + firstLetterToUpCase(field.getName()),field.getType());

//判断方法的形参类型是否是String

if(field.getType().equals(java.lang.String.class)){

//如果是,则直接执行该方法,实参为从属性文件中读取的该成员变量对应的值

method.invoke(sa, properties.getProperty(field.getName()));

}else{

//否则,通过成员变量的实际类型对应的class利用反射机制,调用其valueOf()方法,将属性文件中的字符串强制转换成需要传入的形参类型,并执行该方法为该成员变量赋值

method.invoke(sa, field.getType().getDeclaredMethod("valueOf", java.lang.String.class).invoke(field, properties.getProperty(field.getName())));

}

}

in.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值