我有以下代码:
我要复制的类:
public class NormalChair extends AbstractChair {
protected int height;
protected String name;
public NormalChair() {
super();
}
public NormalChair(String name, int height) {
super(name, height);
}
// Copy constructor - getName() and getHeight() are defined in parent class.
public NormalChair(NormalChair chair) {
this(chair.getName(), chair.getHeight());
}
}
创建一些类
公共对象createObj(String cls\u name,String param1,int param2){返回Class.forName(cls\u name)。getConstructor(String.Class,Integer.Class)。newInstance(param1,param2);}
然后我尝试使用以下内容复制该类的对象:
Object obj_to_copy = createObj("Classname", "name", 10);
String cls_name = obj_to_copy.getClass().getName();
Class.forName(cls_name).getConstructor(Object.class).newInstance(obj_to_copy);
我得到这个错误:
Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.<init>(java.lang.Object)
at java.lang.Class.getConstructor0(Class.java:2800)
at java.lang.Class.getConstructor(Class.java:1708)
at test.ProductTrader.create(ProductTrader.java:57)
at test.Test.main(Test.java:23)
所以我想我需要以不同于将其类型显示为Object的方式html" target="_blank">调用复制构造函数?
附言:我也举了这个例子,因为太简单了。但实际上我不知道在运行时之前需要复制哪个类,所以使用复制构造函数不应该只依赖于Normal椅子类。
更新:
我更新了我的问题,以更清楚地表明,当我在运行时之前复制对象时,我不知道它需要复制什么类。
如果您可以假设复制构造函数接受相同类的对象,则可以执行以下操作:
class ObjectCopier {
public static Object copy(Object orig) {
Class<?> cls = orig.getClass();
Constructor<?> con = cls.getDeclaredConstructor(cls);
return ((con == null) ? null : con.newInstance(orig);
}
}
(未经测试,所以这样对待它)
为什么要在Java中使用复制构造函数呢?在Java中复制对象有一种标准方法:只需克隆它。如果默认克隆不相关,请重写clone()方法。
您只需要编写obj。克隆()以获取副本。
有关详细信息,请参阅clone()的Java留档。
由于某种原因,Java反射严格匹配类和方法签名。因此,为了找到匹配的构造函数,您需要使用类枚举可用的构造函数。getDeclaredConstructors(),并找到一个匹配的构造函数。
我编写了一个小型库来简化任务,这里有一个与之匹配的方法类:HavingMethodSignature。
如果您感兴趣,以下是如何使用此库创建新实例:
Object o = OpenBean.newInstance(Class.forName(cls_name));
问题内容: 我的测试框架中有一个方法可以创建类的实例,具体取决于传入的参数: 问题是,如果构造函数具有基本类型,则这将不起作用,如下所示: 结果是: 原始int会自动装箱到对象版本中,但是如何返回它们以调用构造函数? 问题答案: 使用代替。 根据Javadocs,这是“表示原始类型的Class实例”。 您也可以使用。这是的快捷方式。不仅是类,甚至对于原始类型,您都可以用Java表示。
主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对
所以我正在学习构造函数初始值设定项列表,我写了以下代码: 为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?
问题内容: 我想在BaseClass构造函数中复制SubClass对象。我需要以下代码正确执行。 可能吗?如果可以,我该怎么办?其他如何获得类似的效果? 问题答案: 这是不可能的。类A的构造函数为您提供了A的实例,无法绕开它。为什么不显式实例化子类? 另一种可能性可能涉及静态工厂方法,例如:
可能重复:< br >什么是复制省略和返回值优化? 我有以下程序: 我期望的输出如下: 但我得到以下信息: 问题是:为什么不将对象从func返回到main调用我的复制构造函数?
copy constructor是一个构造函数,它通过使用先前创建的同一类的对象初始化它来创建对象。 复制构造函数用于 - 从另一个相同类型的对象初始化。 复制对象以将其作为参数传递给函数。 复制对象以从函数返回它。 如果没有在类中定义复制构造函数,则编译器本身定义一个。如果该类具有指针变量并具有一些动态内存分配,则必须具有复制构造函数。 这里显示了最常见的复制构造函数形式 - classname