【问题标题】:Private constructor not affecting Dozer私有构造函数不影响推土机
【发布时间】:2016-02-01 06:59:17
【问题描述】:

为了理解 Dozer,我创建了两个类 PrimaryType 和 SecondaryType,并尝试使用 Dozer 映射它们。推土机能够无缝地映射它们。

尝试将 SecondaryType 的构造函数设为私有,但 Dozer 仍然能够成功创建 SecondaryType 类型的对象并能够映射其字段。谁能解释一下 Dozer 如何实例化一个具有私有构造函数的类?

PrimaryType.java

package in.yogi;

public class PrimaryType
{
    private String name;
    private int age;

    public PrimaryType(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "PrimaryType [name=" + name + ", age=" + age + "]";
    }

}

SecondaryType.java

package in.yogi;

public class SecondaryType
{
    private String name;
    private int age;
    private SecondaryType() {

    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "SecondaryType [name=" + name + ", age=" + age + "]";
    }
}

AppMain.java

package in.yogi;

import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;

import in.yogi.PrimaryType;

public class AppMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("This is the main Application!!!");
        PrimaryType sourceObject = new PrimaryType("Munsamy", 20);
        System.out.println(sourceObject);
        Mapper mapper = new DozerBeanMapper();
        SecondaryType destObject =  
            mapper.map(sourceObject, SecondaryType.class);
        System.out.println(destObject);
    }
}

输出:

PrimaryType [name=Munsamy, age=20]
log4j:WARN No appenders could be found for logger (org.dozer.config.GlobalSettings).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SecondaryType [name=Munsamy, age=20]

【问题讨论】:

    标签: java constructor dozer private-constructor


    【解决方案1】:

    这通常使用reflection 完成。 Dozer documentation 解释:

    bean 映射器是用 Java 编写的,并且严重依赖 Jakarta Commons Bean Utils 包来获取 Java Bean 实用程序方法。

    阅读Commons Beanutils项目的文档,可以找到需要的解释:

    Java 语言提供 ReflectionIntrospection API(请参阅 JDK Javadocs 中的 java.lang.reflectjava.beans 包)。但是,这些 API 的理解和使用可能非常复杂。 BeanUtils 组件围绕这些功能提供了易于使用的包装器。

    您可以自己轻松完成:

    public static void main(String[] args) throws Exception {
        Constructor<SecondaryType> constructor = SecondaryType.class.getDeclaredConstructor();
        constructor.setAccessible(true); // if not set accessible, you will get an exception
        SecondaryType instance = constructor.newInstance();
        System.out.println(instance);
    }
    

    【讨论】:

    • 有趣的是,如果将 getter 和 setter 设为私有,则不会复制值。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2011-04-20
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多