【问题标题】:how to create in best way an instance from the class object如何以最佳方式从类对象创建实例
【发布时间】:2014-03-19 01:00:05
【问题描述】:

有一种方法可以避免从一个类中创建一个实例的缓慢反射,显然是在另一个方法中?例如:

Foo foo = new Foo();
foo.create(Dog.class, "rocky");

class Foo {
    Object create(Class object, String dogName) {
        //create an instance of the class 'object' here passing the argument to constructor
        //e.g. Object obj = new object(dogName); <-- this is wrong

        return obj;
    }
}

class Dog extends Animal {
   Dog(String dogName) {
       this.name = dogName;
   }
}

class Animal {
    String name;
}

我无法使用关键字“new”创建实例,因为我必须以动态方式在另一个方法中创建实例...

您可以全权委托以最佳方式(如性能)改进此代码:) 谢谢!

【问题讨论】:

  • 嗯,显而易见的选择是使用switch 语句从可能的new SomeClass() 调用中进行选择。接下来是使用 ClassLoader.loadClass 来获取 Class 指针,然后是 Class.newInstance()。之后是反射选项。
  • “开关”没有,因为结果它也应该是动态的(对于最终用户)。我正在寻找其他解决方案,如 hot licks 建议,谢谢大家

标签: java class object instance processing


【解决方案1】:

让您的 Dog 和 Animal 类保持不变。并使用 Builder 模式

  public interface Builder<T> {
  public T build(String nameString);
}
public static void main(String[] args){
  Builder<Dog> builder =  new Builder<Dog>()
  {

     @Override
     public Dog build(String nameString)
     {
        return new Dog(nameString);
     }

  };
 Dog dog = builder.build("Rocky");
 System.out.print(dog.name);

}

Instantiating object of type parameter 上的答案也进一步解释了这一点。

【讨论】:

    【解决方案2】:
    public <T> T create(Class<T> myClass, String constructorArg) 
    throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {
        Constructor<T> toCall = myClass.getConstructor(String.class);
        return toCall.newInstance(constructorArg);
    }
    

    【讨论】:

    • 错误:“发现太多字符 { 没有 } 来匹配它。”在“throws”关键字的行
    • 对不起,我在错误的地方添加了throws 子句。我现在已经修好了。
    • O.O 现在在 "[...] myClass.getConstructor( [..]" 的行出现 "error noSuchMethodException" :O
    • 那么你有一个构造函数,在你正在使用的类中,它只接受一个String 作为参数?该消息另有说明。
    • 从那个例子看,Dog 是其他东西的非静态内部类。你从来没有告诉过我们。如果是这种情况,您需要传递对外部类对象的引用作为newInstance 的第一个参数;以及它的类型作为getConstructor 的第一个参数。
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多