java8关于int,float类型不能有参获取构造方法问题

来源:3-4 自由编程

诡辩君

2019-11-20 22:16:09

package com.fly.ClassDemo;

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 "Goods [id=" + id + ", name=" + name + ", price=" + price + ", desp=" + desp + "]";
	}
	
	public void display() {
		System.out.println("商品信息:"+this.desp);
	}
	

}

package com.fly.ClassDemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.security.acl.Permission;

import org.junit.Test;

public class ConstructorTest {
	
	@Test
	/**
	 * 获得无参构造方法
	 */
	public void demo() throws Exception {
		Class class1 = Class.forName("com.fly.ClassDemo.Goods");
		Constructor constructor = class1.getConstructor();
		Goods goods = (Goods)constructor.newInstance();
		goods.display();
	}
	
	@Test
	/**
	 * 获得有参构造方法
	 */
	public void demo1() throws Exception {
		Class class1 = Class.forName("com.fly.ClassDemo.Goods");
		Constructor constructor = class1.getConstructor(Integer.class,String.class,Float.class,String.class);
		Goods goods = (Goods)constructor.newInstance(342f);
		System.out.println(goods.toString());
	}

}

java.lang.NoSuchMethodException: com.fly.ClassDemo.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.fly.ClassDemo.ConstructorTest.demo1(ConstructorTest.java:28)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)

at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

为什么我Goods,成员属性是float,int类型时使用反射获取不到有参构造方法。而成员属性是Flot,Integer时使用反射才能获取到有参构造方法。

写回答

1回答

好帮手慕柯南

2019-11-21

同学你好!

这里因为同学在Goods中定义的int和float,而在获取Constructor对象时传入的是Integer.class,Float.class,这样就会报错呢

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

同学将其改为int和float就可以了,另外你的有参构造函数包含了所有的参数,因此使用有参的构造函数时要将所有的参数都传入,否则会报错:

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

如果我的回答解决了解决了你的疑惑,请采纳,祝学习愉快~


0

0 学习 · 8016 问题

查看课程