带参构造方法为什么使用包装器类的对象来进行设置的话会报错呢?

来源:3-4 自由编程

慕勒3498910

2020-10-07 20:46:10

com.imooc.reflect.test/Goods.java的内容如下:

package com.imooc.reflect.test;

public class Goods {
	// 商品编号
	private int id;
	// 商品名称
	private String name;
	// 商品价格
	private float price;
	// 商品描述
	private String desp;
	
	public Goods() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Goods(int id, String name, float price, String desp) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.desp = desp;
	}

	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public float getPrice() {
		return price;
	}
	
	public void setPrice(float price) {
		this.price = price;
	}
	
	public String getDesp() {
		return desp;
	}
	
	public void setDesp(String desp) {
		this.desp = desp;
	}

	@Override
	public String toString() {
		return "商品信息 [商品编号为:" + id + ", 商品名称为:" + name + ", 商品价格为:" + price + ", 商品描述为:" + desp + "]";
	}
	
	/**
	 * 输出商品信息
	 */
	public void display() {
		System.out.println("商品信息");
	}	
	
}

com.imooc.reflect.test/ConstructorGoods.java这一测试类的内容如下:

package com.imooc.reflect.test;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class ConstructorGoods {
	@Test
	/**
	 * 通过Constructor获得无参构造方法,并得到Goods类的对象,然后调用display()方法
	 * @throws Exception 
	 */
	public void demo1() throws Exception {
		Class goodsClass = Class.forName("com.imooc.reflect.test.Goods");
		Constructor c = goodsClass.getConstructor();
		Goods good = (Goods)goodsClass.newInstance();
		good.display();
	}
	
	@Test
	/**
	 * 通过Constructor获得有参构造方法,并得到Goods类的对象,然后输出该对象
	 */
	public void demo2() throws Exception {
		Class goodsClass = Class.forName("com.imooc.reflect.test.Goods");
		Constructor c = goodsClass.getConstructor(int.class, String.class, float.class, String.class);
		// 使用如下的包装器类来设置参数会报错
		// Constructor c = goodsClass.getConstructor(Integer.class, String.class, Float.class, String.class);
		Goods good = (Goods)c.newInstance(1, "手机", 2000.0f, "黑色,存储容量32G");
		good.display();
		// 输出该对象
		System.out.println(good);
	}
	
}

这边,我试了下,在demo2()中使用这样的方式调用构造方法的话

Constructor c = goodsClass.getConstructor(Integer.class, String.class, Float.class, String.class);

最后,控制台输出的内容为:

java.lang.NoSuchMethodException: com.imooc.reflect.test.Goods.<init>(java.lang.Integer, java.lang.String, java.lang.Float, java.lang.String)
	at java.lang.Class.getConstructor0(Unknown Source)
	at java.lang.Class.getConstructor(Unknown Source)
	at com.imooc.reflect.test.ConstructorGoods.demo2(ConstructorGoods.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

程序无法正常运行。

写回答

1回答

好帮手慕小脸

2020-10-08

同学你好,

1、测试运行同学代码是正确的,棒棒哒!继续加油

2、控制台出现报错是因为同学在Goods中定义的是int,float,而在获取Constructor对象时传入的是Integer.class,Float.class,这样就会报错呢。

http://img.mukewang.com/climg/5f7e7f900942658803900204.jpg

如果我的回答解决了你的问题,请采纳,祝学习愉快.


0

0 学习 · 8016 问题

查看课程