package com.itheima.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class MyreflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//1. 获取class文件的对象
Class clazz = Class.forName("com.itheima.reflect.Student");
//2. 获取构造方法
/*Constructor[] cons = clazz.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}*/
/*Constructor[] cons = clazz.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}*/
/*Constructor con = clazz.getDeclaredConstructor();
System.out.println(con);
Constructor con2 = clazz.getDeclaredConstructor(String.class);
System.out.println(con2);
*/
Constructor con3 = clazz.getDeclaredConstructor(String.class, int.class);
// System.out.println(con3);
/* int modifiers = con3.getModifiers();
System.out.println(modifiers);
Parameter[] parameters = con3.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}*/
// 暴力反射:表示临时取消权限校验
con3.setAccessible(true);
Student stu = (Student) con3.newInstance("张三", 23);
System.out.println(stu);
}
}
笔记
获取 $ public $ 修饰符的构造方法
获取全部构造方法
获取单个构造方法
代码报错原因: $ getConstructor() $ 只能获取 $ public $ 类型的构造方法
获取带有多个参数的构造方法
idea中反射的应用场景
反射的应用场景如果构造方法被$ private $修饰的话, $ idea $只会提示第一个空参的,第二个$ String name $的,第三个$ int age $的,不让我调用有两个参数的那个构造方法
parameter()
$ parameter $可以让我们看到我们能创建对象的传递参数
这里报错是因为我们无法构造带有 $ private $修饰符的对象
因此我们可以用$ setAccessible() $来取消$ private $的校验
代码如下: