反射技术主要是是对类中成员属性、构造方法、成员方法的获取和调用
1、如果想获取3者中公开(public)的XX,我们使用普通的方法即可,但是一旦我们想要获取3者中被其他访问修饰符修饰的XX,我们就要使用被"Declared"修饰的方法,比如【getDeclaredField、getDeclaredConstructor。。。】
2、如果说,我们已经获取到私有的XX,在使用时会报IllegalAccessException异常,是因为我们虽然获取了私有的XX,但是在使用时JVM虚拟机仍然会检查我们的访问修饰符,此时 构造方法/成员属性.setAccessible(true);放开权限,不让JVM虚拟机进行检查
3、获取成员方法后的赋值操作(2种情况:(1)有参数 (2)有返回值)
(1)有参数:参数中直接跟上方法名,再者,参数类型的class类型
(2)有返回值:有返回值后面我们就要得到它的返回值(Object类型),并且使用invoke()方法
【
public void show() {
System.out.println("show");
}
public String method(String name,int age) {
return name+"******" + age;
}
】
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("com.qsw.reflect.Person");
//使用字节码文件对象获取构造方法用来构造对象
Constructor con = clazz.getConstructor();
Object object = con.newInstance();
//使用字节码文件对象获取成员方法()
Method showMethod = clazz.getMethod("show");
showMethod.invoke(object);
System.out.println(object);
//通过反射获取带参带返回值的成员方法,有返回值的情况下我们要用Object类型接收才行
Method methodMethod = clazz.getMethod("method", String.class,int.class);
Object object2 = methodMethod.invoke(object, "林青霞",68);
System.out.println(object2);
}