Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以最佳方式从类对象创建实例_Java_Class_Object_Instance_Processing - Fatal编程技术网

Java 如何以最佳方式从类对象创建实例

Java 如何以最佳方式从类对象创建实例,java,class,object,instance,processing,Java,Class,Object,Instance,Processing,有一种方法可以避免从类中创建实例的缓慢反射,显然是在另一个方法中?例如: 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

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

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;
}
Foo-Foo=new-Foo();
foo.create(Dog.class,“rocky”);
福班{
对象创建(类对象、字符串dogName){
//在此处创建类“object”的实例,并将参数传递给构造函数
//e、 g.objectobj=newobject(dogName);
publictcreate(Class myClass,stringconstructorarg)
抛出IllegalArgumentException、InstantiationException、IllegalAccessException、InvocationTargetException、SecurityException、NoSuchMethodException{
构造函数toCall=myClass.getConstructor(String.class);
返回call.newInstance(constructorArg);
}
public T创建(类myClass,字符串构造函数Arg)
抛出IllegalArgumentException、InstantiationException、IllegalAccessException、InvocationTargetException、SecurityException、NoSuchMethodException{
构造函数toCall=myClass.getConstructor(String.class);
返回call.newInstance(constructorArg);
}

保持您的狗和动物类相同。并使用生成器模式

  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);
公共界面生成器{
公共T构建(字符串名称字符串);
}
公共静态void main(字符串[]args){
Builder=new Builder()
{
@凌驾
公共狗构建(字符串名称字符串)
{
返回新狗(名称字符串);
}
};
Dog Dog=建筑商。建筑(“Rocky”);
系统输出打印(狗名);
}


上面的答案也进一步解释了这一点。

让您的狗和动物类保持不变。并使用生成器模式

  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);
公共界面生成器{
公共T构建(字符串名称字符串);
}
公共静态void main(字符串[]args){
Builder=new Builder()
{
@凌驾
公共狗构建(字符串名称字符串)
{
返回新狗(名称字符串);
}
};
Dog Dog=建筑商。建筑(“Rocky”);
系统输出打印(狗名);
}


上面的答案也进一步解释了这一点。

好吧,显而易见的选择是一个
switch
语句,从可能的
newsomeclass()
调用中进行选择。接下来是使用ClassLoader.loadClass获取类指针,然后是Class.newInstance()。之后是反射选项。“switch”不,因为结果也应该是动态的(对于最终用户)…我正在寻找其他解决方案,如hot Clicks建议的,谢谢你,guysWell,显而易见的选择是一个
开关
语句,从可能的
新SomeClass()中进行选择
invocations。下一步是使用ClassLoader.loadClass获取类指针,然后是Class.newInstance()。之后是反射选项。“切换”否,因为其结果也应该是动态的(对于最终用户)…我正在寻找其他解决方案,如hot Clicks建议的,谢谢guyserror:“发现太多字符{没有}与之匹配。”在“throws”关键字的行抱歉,我在错误的位置添加了
throws
子句。我现在已经修复了它。O.O现在在“[…]myClass.getConstructor([…]行)的“error noSuchMethodException”中添加了“error noSuchMethodException”":OSo在您使用的类中是否有构造函数,它只将
字符串
作为参数?该消息表明情况并非如此。从该示例看,
Dog
是其他类的非静态内部类。您从未告诉过我们。如果是这种情况,您需要传递对外部类对象的引用s作为
newInstance
的第一个参数;它的类型作为
getConstructor
的第一个参数。错误:“发现太多字符{没有一个}与之匹配。”在“throws”关键字的行对不起,我在错误的位置添加了
throws
子句。我现在已经修复了它。O.O现在“error noSuchMethodException”在“[…]myClass.getConstructor([…]”的行中:OSo在您使用的类中是否有构造函数,它只将
字符串
作为参数?该消息表明情况并非如此。从该示例看,
Dog
是其他类的非静态内部类。您从未告诉过我们。如果是这种情况,您需要传递对外部类对象的引用s作为
newInstance
的第一个参数;它的类型作为
getConstructor
的第一个参数。