1. 介绍
我们想要对某一个对象中的一个或多个属性赋值,通常使用的有两种方法,其他的方法就不概括进来了。
- set方法
- 构造器初始化
第一种方法可以实现我们根据自己的需求赋值。但是也有弊端,就是我们在赋值的时候如果需要对多个属性赋值就要用到多个set,代码不美观。
第二种方法,如果使用普通构造器初始化,弊端就是当一个类有很多属性,比如有10个的时候,我们想要对其中某一个值赋值,其他不赋值,这时候需要重写一个构造器或者使用全属性构造器赋值。非常不方便。
所以,我们可以自己写一个特殊构造器,根据自己想要的需求进行赋值,内部调用反射方法动态赋值,而不是写死。
2. 代码
2.1 实体类
public class User {
private int id;
private String name;
private String account;
private String password;
private String email;
private String emailPermission;
private String userKind;
private String headProtrait;
private String isActive;
public User() {
}
/**
* 特殊构造器
* @param s 参数
*/
public User(Object... s) throws Exception {
//获取当前类
Class<User> userClass = User.class;
for (int i = 0; i < s.length; i++) {
//分成两部分左边是属性,右边是属性值
String[] split = String.valueOf(s[i]).split("=");
//获取属性
Field declaredField = userClass.getDeclaredField(split[0].trim());
//获取属性的类型名字
String simpleName = declaredField.getType().getSimpleName();
//通过反射获取该属性的set方法
String setMethod = toSet(split[0]);
//获取该属性的set方法
Method method = userClass.getMethod(setMethod, declaredField.getType());
//方法执行
MethodInvoke(this, simpleName, split[1].trim(), method);
}
}
public User(int id, String name, String account, String password, String email, String emailPermission, String userKind, String headProtrait, String isActive) {
this.id = id;
this.name = name;
this.account = account;
this.password = password;
this.email = email;
this.emailPermission = emailPermission;
this.userKind = userKind;
this.headProtrait = headProtrait;
this.isActive = isActive;
}
public String getIsActive() {
return isActive;
}
public void setIsActive(String isActive) {
this.isActive = isActive;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmailPermission() {
return emailPermission;
}
public void setEmailPermission(String emailPermission) {
this.emailPermission = emailPermission;
}
public String getUserKind() {
return userKind;
}
public void setUserKind(String userKind) {
this.userKind = userKind;
}
public String getHeadProtrait() {
return headProtrait;
}
public void setHeadProtrait(String headProtrait) {
this.headProtrait = headProtrait;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", account='" + account + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", emailPermission='" + emailPermission + '\'' +
", userKind='" + userKind + '\'' +
", headProtrait='" + headProtrait + '\'' +
", isActive=" + isActive +
'}';
}
}
public class UserChat {
private int id;
private String userName;
private String friendName;
private String content;
private String msgType;
/**
* 特殊构造器
* @param s 参数
*/
public UserChat(Object... s) throws Exception {
//获取当前类
Class<UserChat > UserChatClass = UserChat .class;
for (int i = 0; i < s.length; i++) {
//分成两部分左边是属性,右边是属性值
String[] split = String.valueOf(s[i]).split("=");
//获取属性
Field declaredField = UserChatClass.getDeclaredField(split[0].trim());
//获取属性的类型名字
String simpleName = declaredField.getType().getSimpleName();
//通过反射获取该属性的set方法
String setMethod = toSet(split[0]);
//获取该属性的set方法
Method method = UserChatClass.getMethod(setMethod, declaredField.getType());
//方法执行
MethodInvoke(this, simpleName, split[1].trim(), method);
}
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String type) {
this.msgType = type;
}
@Override
public String toString() {
return "UserChat{" +
"id=" + id +
", userName='" + userName + '\'' +
", friendName='" + friendName + '\'' +
", content='" + content + '\'' +
", type='" + msgType + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFriendName() {
return friendName;
}
public void setFriendName(String friendName) {
this.friendName = friendName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public UserChat() {
}
public UserChat(int id, String userName, String friendName, String content, String msgType) {
this.id = id;
this.userName = userName;
this.friendName = friendName;
this.content = content;
this.msgType = msgType;
}
}
2.2 工具类
/**
* 对八大基本数据类型和一个char数组进行转换
* @param user 实体对象
* @param simpleName 属性类型名
* @param value 属性值
* @param method 方法
* @param <T> 泛型参数
* @throws Exception 异常
*/
public static<T> void MethodInvoke(T user, String simpleName, String value, Method method) throws Exception {
//int类型
if(simpleName.equals("int")){
int intValue = Integer.parseInt(value);
method.invoke(user, intValue);
}
//long类型
if(simpleName.equals("long")){
long longValue = Long.parseLong(value);
method.invoke(user, longValue);
}
//short类型
if(simpleName.equals("short")){
short shortValue = Short.parseShort(value);
method.invoke(user, shortValue);
}
//byte类型
if(simpleName.equals("byte")){
byte byteValue = Byte.parseByte(value);
method.invoke(user, byteValue);
}
//float类型
if(simpleName.equals("float")){
float floatValue = Float.parseFloat(value);
method.invoke(user, floatValue);
}
//double类型
if(simpleName.equals("double")){
Double doubleValue = Double.parseDouble(value);
method.invoke(user, doubleValue);
}
//char数组
if(simpleName.equals("char[]")){
char[] chars = value.toCharArray();
method.invoke(user, chars);
}
//char
if(simpleName.equals("char")){
char[] chars = value.toCharArray();
method.invoke(user, chars[0]);
}
//String
if(simpleName.equals("String")){
method.invoke(user, value);
}
}
/**
* 把传入的参数转化为set的String类型返回
* @param name 传入的参数
* @return 返回该参数的set方法的方法名
*/
public static String toSet(String name){
String setName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
return setName.trim();
}
2.3 测试类
@Test
public void test() throws Exception {
User user = new User("id=1", "userKind=user");
System.out.println(user);
//User{id=1, name='null', account='null', password='null', email='null', emailPermission='null', userKind='user', headProtrait='null', isActive=null}
UserChat userChat = new UserChat("userName=jol","id=1");
System.out.println(userChat);
//UserChat{id=1, userName='jol', friendName='null', content='null', type='null'}
}
可以看到上面创建对象的时候,只需要把自己想要初始化的值用key=value, key=value的形式传进去就行了,想要对哪个赋值就对哪个赋值。这样一来,当对象多的时候就不用担心每次还要在实体类写一个构造器或者把其他的属性也写进构造器了。
3. 总结
完成这个效果,只需要在实体类中使用反射+构造器就行了。提供属性的名字判断属性的类型,然后进行类型转换(因为属性一开始是String类型的),获取set方法,利用invoke来实现。这个是对任何实体类都通用的,直接复制粘贴就可以用。
如有错误,欢迎指出