示例我之后有数据层

public class DemoData implements Cloneable {

    private String name;
    private String value;

    public String getName() {
        return name;
    }

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

    public String getValue() {
        return value;
    }

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

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); //To change body of generated methods, choose Tools | Templates.
    }
}


我想将数据值(DemoData)分配给重复数据(DemoData clone)层,如下所示

public static void main(String[] args) {
        DemoData demoData = new DemoData();
        demoData.setName("Class Sources");
        testReflectionDemo(demoData);
    }

    private static DemoData testReflectionDemo(DemoData demoData) {
        try {
            DemoData clone = (DemoData) demoData.clone();
            clone.setName(demoData.getName());
            clone.setValue(demoData.getValue());
            return clone;
        } catch (CloneNotSupportedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }


我想将方法​​testReflectionDemo(DemoData demoData)转换为方法testReflectionDemo(T t)反射,如下所示。我不知道如何继续,请帮助我

public <T> T testReflectionDemo(T t){
        Class<?> aClass = t.getClass();
        for (Method method : aClass.getMethods()) {

        }
        return null;
    }

最佳答案

如果testReflectionDemo的参数是一个Javabean,则意味着该参数的类具有多个setXXX对方法,而'getXXX ,and the getXXX don't have argument,the setXXX`仅具有一个参数。如果是,则以下内容代码可以将属性从旧对象复制到新对象。

    Class<?> aClass = t.getClass();
    Object result = aClass.newInstance();
    Map<String,MethodHolder> map=new HashMap<>();
    for (Method method : aClass.getMethods()) {
        if(method.getName().startsWith("get") && method.getParameterTypes().length==0){
            String property=method.getName().substring(3);
            MethodHolder hodler = map.get(property);
            if(hodler ==null){
                map.put(property, new MethodHolder(property, method, null));
                continue;
            }
            hodler.getMethod=method;
        }else if (method.getName().startsWith("set") && method.getParameterTypes().length==1) {
            String property=method.getName().substring(3);
            MethodHolder holder = map.get(property);
            if(holder ==null){
                map.put(property, new MethodHolder(property, null, method));
                continue;
            }
            holder.setMethod=method;
        }
    }
    List<MethodHolder> collect = map.values().stream().filter(item -> item.setMethod != null && item.getMethod != null).collect(Collectors.toList());
    for (MethodHolder holder : collect) {
        Object property = holder.getMethod.invoke(t);
        holder.setMethod.invoke(result,property);
    }
    return (T)result;


MethodHolder仅具有一些字段:

public static class MethodHolder{
    private String property;
    private Method getMethod;
    private Method setMethod;

    public MethodHolder() {
    }

    public MethodHolder(String property, Method getMethod, Method setMethod) {
        this.property = property;
        this.getMethod = getMethod;
        this.setMethod = setMethod;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof MethodHolder)) return false;
        MethodHolder that = (MethodHolder) o;
        return Objects.equals(property, that.property);
    }

    @Override
    public int hashCode() {
        return Objects.hash(property);
    }
}


请注意,以下代码只是进行浅表复制。

10-06 10:38