我在java中创建对象有问题,我有3个jar,每个都有一个名为“Person”的类,我包含了那些jars文件 进入我的项目,我需要定义3个对象Person,问题如下:
public class UtilClass {
public static com.jar1.Person definePerson1() {
com.jar1.Person person = new com.jar1.Person();
person.setName(Constant.NAME);
person.setLastName(Constant.LASTNAME);
return person;
}
public static com.jar2.Person definePerson2() {
com.jar2.Person person = new com.jar2.Person();
person.setName(Constant.NAME);
person.setLastName(Constant.LASTNAME);
return person;
}
public static com.jar3.Person definePerson3() {
com.jar3.Person person = new com.jar3.Person();
person.setName(Constant.NAME);
person.setLastName(Constant.LASTNAME);
return person;
}
}
正如你所看到的,这些类是“相同的”,但是包是不同的,我有这个UtilClass,因为我在另一个类中定义了一个方法:
public void create() {
com.jar1.Group = new Group(UtilClass.definePerson1()); //Only accept com.jar1.Person
com.jar2.Group = new Group(UtilClass.definePerson2()); //Only accept com.jar2.Person
com.jar3.Group = new Group(UtilClass.definePerson3()); //Only accept com.jar3.Person
}
如何简化类UtilClass
并避免重复代码?我无法更改我的jar文件。
答案 0 :(得分:1)
您可以使用反射来设置值。
例如,使用BeanUtils和ConstructorUtils,比java bean api更容易使用(参见answer)
public static class UtilClass {
public static com.jar1.Person definePerson1() {
return newPerson(com.jar1.Person.class);
}
public static com.jar2.Person definePerson2() {
return newPerson(com.jar2.Person.class);
}
public static com.jar3.Person definePerson3() {
return newPerson(com.jar3.Person.class);
}
public static <T> T newPerson(Class<T> clazz) {
try {
T person = ConstructorUtils.invokeConstructor(clazz, null);
BeanUtils.setProperty(person, "name", Constant.NAME);
BeanUtils.setProperty(person, "lastName", Constant.LASTNAME);
return person;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
答案 1 :(得分:1)
如果这些类没有任何共同点,即不实现可以使用的通用接口,
您可以使用标准java.beans
包在没有任何第三方库的情况下解决任务:
import java.beans.Expression;
import java.beans.Statement;
public class UtilClass {
public static <T> T definePerson(Class<T> type) {
try {
Object o=new Expression(type, "new", null).getValue();
new Statement(o, "setName", new Object[]{Constant.NAME}).execute();
new Statement(o, "setLastName", new Object[]{Constant.LASTNAME}).execute();
return type.cast(o);
} catch(Exception ex) { throw new IllegalStateException(ex); }
}
}
感谢Generics,该方法声明返回您传入的Class
实例的类型。然后您的用例将如下所示:
com.jar1.Group = new Group(UtilClass.definePerson(com.jar1.Person.class));
com.jar2.Group = new Group(UtilClass.definePerson(com.jar2.Person.class));
com.jar3.Group = new Group(UtilClass.definePerson(com.jar3.Person.class));
答案 2 :(得分:0)
如果三个Persos类没有带有name和lastName字段的公共超类或与setName和setLastName方法接口,则最简单的解决方案是使用反射。
然而,使用反射是不好的做法。如果稍后将Person的名称重命名为firstName,则代码将编译,并且没有任何内容会警告您,您的UtilClass已损坏。