只是为了理解推土机,我创建了两个类 PrimaryType 和 SecondaryType,并尝试使用推土机映射它们。 推土机能够无缝地绘制它们。
尝试将 SecondaryType 的构造函数设为私有,但 Dozer 仍然能够成功创建 SecondaryType 类型的对象,并能够映射其字段。 谁能解释一下推土机如何实例化一个具有私有构造函数的类?
主要类型.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 + "]";
}
}
次要类型.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 + "]";
}
}
应用主.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]
这通常是通过反射来完成的。推土机文档解释道:
Bean 映射器是用 Java 编写的,并且严重依赖 Jakarta Commons Bean Utils 包来实现 Java Bean 实用程序方法。
阅读Commons Beanutils项目的文档,您可以找到所需的解释:
Java 语言提供反射和内省 API(请参阅 JDK Javadocs 中的
java.lang.reflect
和java.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);
}