反射--构造方法:Construct

Class c = Student.class;
Object o = c.newInstance();
c.newInstance()默认调用Student的公共无参构造函数创建对象,如果Student类中没有public修饰的构造函数则会报错(这是大部分框架都要求bean中要有一个公共的无参构造的原因吗)
Constructor ct = c.getConstructor();//获取一个public的构造
Constructor[ ] cs = c.getConstructors();//获取所有public的构造
Constructor ct = c.getDeclaredConstructor();//获取一个构造
Constructor[ ] ct = c.getDeclaredConstructors();//获取所有构造
Student类
public class Student {
	public String school;
	private String sNo;
	protected int age;
	float score;
	public static final String birth ="1995-01-09";
	
	private Student() {
		System.out.println("我是Student的无参构造方法");
	}
	
	protected Student(String school, String sNo) {
		this.school = school;
		this.sNo = sNo;
		System.out.println("我是Student的2个参数的构造方法");
	}
	
	 Student(String school, String sNo, int age) {
		this.school = school;
		this.sNo = sNo;
		this.age = age;
		System.out.println("我是Student的3个参数的构造方法");
	}
	
	public Student(String school, String sNo, int age, float score) {
		this.school = school;
		this.sNo = sNo;
		this.age = age;
		this.score = score;
		System.out.println("我是Student的4个参数的构造方法");
	}
}
测试类
public class ConstructTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Class clas = Student.class;
		Object o = null;
		try {
			Constructor[] cs = clas.getDeclaredConstructors();
			System.out.println(clas.getName() + "有"+cs.length+"个构造函数");
			for (Constructor c : cs) {
				c.setAccessible(true);
				Class[] pc = c.getParameterTypes();
				Object[] param = new Object[pc.length];
				System.out.println(c);
				if(pc.length == 0) {
					System.out.println("执行无参构造函数");
					o = c.newInstance(param);
					continue;
				}
				for(int i = 0;i < pc.length;i++) {
					System.out.println("请输入第个" +(i +1 )+"类型为" +pc[i]+ "的参数");
					String input = sc.next();
					if(pc[i] == int.class) {
						param[i] = Integer.valueOf(input);
					}else if(pc[i] == float.class) {
						param[i] = Float.valueOf(input);
					}else if(pc[i] == double.class) {
						param[i] = Double.valueOf(input);
					}else if(pc[i] == byte.class) {
						param[i] = Byte.valueOf(input);
					}else if(pc[i] == String.class) {
						param[i] = input;
					}else if(pc[i] == boolean.class) {
						param[i] = Boolean.valueOf(input);
					}else if(pc[i] == char.class) {
						param[i] = Character.valueOf(input.charAt(0));
					}else if(pc[i] == long.class) {
						param[i] = Long.valueOf(input);
					}else if(pc[i] == short.class) {
						param[i] = Short.valueOf(input);
					}else {
						System.out.println("数据类型类型非8大基础类型或String无法输入,进行下一个成员赋值");
						continue;
					}
				}
				System.out.println("参数输入完成,执行" +c+ "构造方法");
				o = c.newInstance(param);
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}

	}

}

运行

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 错误信息中提到了com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('2020-06-14 20:13:04')。这个错误是因为在反序列化过程中,没有找到合适的构造函数来将字符串值('2020-06-14 20:13:04')转换为java.time.LocalDateTime对象。\[3\]中的实体类OidcProtocolAccessToken没有提供默认构造函数,可能是导致这个错误的原因之一。要解决这个问题,你可以在OidcProtocolAccessToken类中添加一个带有String参数的构造函数,用于将字符串值转换为LocalDateTime对象。 #### 引用[.reference_title] - *1* [com.fasterxml.jackson.databind.exc.InvalidDefinitionException](https://blog.csdn.net/qq_59312178/article/details/127347156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance](https://blog.csdn.net/zhou_zhao_xu/article/details/124984265)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值