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
的第一个参数。