快速创建Java类对象

快速创建Java类对象,java,class,object,runtime,Java,Class,Object,Runtime,所以,我正在做一个小的(但仍然是乏味的)课程,确切的数字是20个课程,但这并不重要 我的程序将要做的一件事是读取一个2参数的输入,(stringclassname,stringname),并为其构造函数添加一个新对象,该对象的类名为className,参数为name 所以,想象一下狗,猫,猪,蛾子,老鼠,等等。。。 它们都采用相同的构造函数,只是不同的类。 而不是做 if (className.equalsIgnoreCase("Dog")){ myArrayList.add(new

所以,我正在做一个小的(但仍然是乏味的)课程,确切的数字是20个课程,但这并不重要

我的程序将要做的一件事是读取一个2参数的输入,(stringclassname,stringname),并为其构造函数添加一个新对象,该对象的类名为className,参数为name

所以,想象一下狗,猫,猪,蛾子,老鼠,等等。。。 它们都采用相同的构造函数,只是不同的类。 而不是做

if (className.equalsIgnoreCase("Dog")){
     myArrayList.add(new Dog(name));
} else if (className.equalsIgnoreCase("Cat")){
     myArrayList.add(new Cat(name));
} else if (...)
有没有一种方法可以让我简单地做到这一点

myArrayList.add(new X(name));

或者它熟悉的东西?

如果所有类都在同一个包中,则可以使用反射:

Class<?> clazz = Class.forName("your.package." + className);
Constructor<?> constructor = clazz.getConstructor(String.class);
myArrayList.add((CommonParent) constructor.newInstance(name));
Class clazz=Class.forName(“您的.package.”+className);
Constructor=clazz.getConstructor(String.class);
添加((CommonParent)构造函数.newInstance(名称));

如果所有类都在同一个包中,则可以使用反射:

Class<?> clazz = Class.forName("your.package." + className);
Constructor<?> constructor = clazz.getConstructor(String.class);
myArrayList.add((CommonParent) constructor.newInstance(name));
Class clazz=Class.forName(“您的.package.”+className);
Constructor=clazz.getConstructor(String.class);
添加((CommonParent)构造函数.newInstance(名称));

您也可以这样做。这个例子没有Spring框架,但是有了Spring框架,它可以简单一些

  • 为工厂定义接口
  • 公共接口动画工厂{
    布尔isFactoryForType(字符串类型);
    动物createWithName(字符串名称);
    }
    
  • 机具工厂
  • 公共类DogFactory实现AnimalFactory{
    @凌驾
    公共布尔值isFactoryForType(字符串类型){
    返回“dog.equalsIgnoreCase(类型)”;
    }
    @凌驾
    公用狗createWithName(字符串名称){
    返回新狗(名称);
    }
    }
    
    公共类CatFactory实现AnimalFactory{
    @凌驾
    公共布尔值isFactoryForType(字符串类型){
    返回“cat”。相等信号情况(类型);
    }
    @凌驾
    公用Cat createWithName(字符串名称){
    返回新的Cat(名称);
    }
    }
    
  • 狗的例子
  • 公共类狗扩展了动物{
    公共狗(字符串名称){
    超级(姓名);
    }
    @凌驾
    公共字符串toString(){
    return“这是一只名为:+getName()的狗”;
    }
    }
    
  • 示例用法
  • publicstaticvoidmain(字符串[]args){
    如果(参数长度!=2){
    System.err.println(“预期类型和名称作为输入参数”);
    系统出口(1);
    }
    字符串类型=args[0];
    字符串名称=args[1];
    List animalFactory=animalFactories.stream()
    .filter(工厂->工厂.isFactoryForType(类型))
    .findFirst()
    .orelsetrow(()->新的IllegalArgumentException(“类型”+类型+“不支持”));
    Animal=animalFactory.createWithName(名称);
    System.out.println(“创建的动物:“+动物”);
    }
    
  • 带参数的输出:dog Boris
  • 创造动物:这是一只名叫鲍里斯的狗

  • 带参数的输出:汽车账单

  • 创造动物:这是一只名叫比尔的猫

    你也可以这样做。这个例子没有Spring框架,但是有了Spring框架,它可以简单一些

  • 为工厂定义接口
  • 公共接口动画工厂{
    布尔isFactoryForType(字符串类型);
    动物createWithName(字符串名称);
    }
    
  • 机具工厂
  • 公共类DogFactory实现AnimalFactory{
    @凌驾
    公共布尔值isFactoryForType(字符串类型){
    返回“dog.equalsIgnoreCase(类型)”;
    }
    @凌驾
    公用狗createWithName(字符串名称){
    返回新狗(名称);
    }
    }
    
    公共类CatFactory实现AnimalFactory{
    @凌驾
    公共布尔值isFactoryForType(字符串类型){
    返回“cat”。相等信号情况(类型);
    }
    @凌驾
    公用Cat createWithName(字符串名称){
    返回新的Cat(名称);
    }
    }
    
  • 狗的例子
  • 公共类狗扩展了动物{
    公共狗(字符串名称){
    超级(姓名);
    }
    @凌驾
    公共字符串toString(){
    return“这是一只名为:+getName()的狗”;
    }
    }
    
  • 示例用法
  • publicstaticvoidmain(字符串[]args){
    如果(参数长度!=2){
    System.err.println(“预期类型和名称作为输入参数”);
    系统出口(1);
    }
    字符串类型=args[0];
    字符串名称=args[1];
    List animalFactory=animalFactories.stream()
    .filter(工厂->工厂.isFactoryForType(类型))
    .findFirst()
    .orelsetrow(()->新的IllegalArgumentException(“类型”+类型+“不支持”));
    Animal=animalFactory.createWithName(名称);
    System.out.println(“创建的动物:“+动物”);
    }
    
  • 带参数的输出:dog Boris
  • 创造动物:这是一只名叫鲍里斯的狗

  • 带参数的输出:汽车账单
  • 创造动物:这是一只名为比尔的猫