首先需求是这样的 ,我把它简化一下:
User user1=new User();
user1.setUserName("wxn");
User user2=new User();
user2.setUserName("kkkk");
User user3=user2;
接下来的操作我想让user2中的值和user1中的值全部相等。我们知道可以通过 user2=user1.clone()方法去获得一个新的对象,这种方法的详细介绍在这里可以学习。http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html
但是这样clone出来的是一个新的对象,user2就是user1的一个新对象的拷贝,虽然user2中的值可以和user1中的值相等,但是 user3就已经不是user2之前的对象了,我需要user3中的值也跟着改变。
于是最简单的方法就是在User类中增加一个方法
public void copy(User user){ this.setUserName(user.getUserName); this.setUserId(user.setUserId); ..... }
如果user中的属性太多怎么办?那写起来太麻烦了,除了方法名get和set有区别之外没什么区别, 于是我想起了之前看过的java反射机制来批量处理,顺便巩固一下java的反射机制,实现代码如下
public void copy(User user) { //获得User类中所有的方法 Method[] methods = user.getClass().getMethods(); try { for (int i = 0; i < methods.length; i++) { String mName = methods[i].getName(); if (mName.startsWith("set")) { String nName =null; //若为boolean的属性则没有get方法 只有 isXXX方法 if(boolean.class.equals(methods[i].getParameterTypes()[0]) ){ nName=mName.replace("set", "is"); } else{ nName=mName.replace("set", "get"); } Method method = user.getClass().getDeclaredMethod(nName, null); methods[i].invoke(this, method.invoke(user, null)); } } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
全部代码如下
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * * @author ahsiu * */ public class User { private int userId; private String userName; private String password; private String email; private String phone; private int loginState; private boolean flag; public int getUserId() { return userId; } public void copy(User user) { Method[] methods = user.getClass().getMethods(); try { for (int i = 0; i < methods.length; i++) { String mName = methods[i].getName(); if (mName.startsWith("set")) { String nName =null; //若为boolean的属性则没有get方法 只有 isXXX方法 if(boolean.class.equals(methods[i].getParameterTypes()[0]) ){ nName=mName.replace("set", "is"); } else{ nName=mName.replace("set", "get"); } Method method = user.getClass().getDeclaredMethod(nName, null); methods[i].invoke(this, method.invoke(user, null)); } } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void setUserId(int userId) { this.userId = userId; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public int getLoginState() { return loginState; } public void setLoginState(int loginState) { this.loginState = loginState; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public static void main(String[] args) { User user1=new User(); user1.setUserName("wxn"); User user2=new User(); user2.setUserName("kkkk"); User user3=user2; System.out.println(user1.getUserName()); System.out.println(user2.getUserName()); System.out.println(user3.getUserName()); System.out.println(""); user2.copy(user1); System.out.println(user1.getUserName()); System.out.println(user2.getUserName()); System.out.println(user3.getUserName()); System.out.println(""); user3.setUserName("ahsiu"); System.out.println(user1.getUserName()); System.out.println(user2.getUserName()); System.out.println(user3.getUserName()); } }