反射概述
Class就是类的镜像
获取Class类对象三种方法
反射获取构造方法并使用![加粗样式](https://i-blog.csdnimg.cn/blog_migrate/10954af3be7ebd11f94d2e6345ac13a8.png)
练习
暴力反射
当构造函数为私有时,使用setAccessible() 可以访问私有成员
Class获取成员变量并使用
Class<?> aClass = Class.forName("Students.Student");
Constructor<?>[] constructors = aClass.getConstructors();
// for(Constructor<?> s:constructors)
// {
// System.out.println(s);
// }
Constructor<?> constructor = aClass.getConstructor(int.class, String.class, int.class);
Object o = constructor.newInstance(18, "小何", 20);
//name
Field name = aClass.getField("name");
name.set(o,"小贺");//
System.out.println(o);//Student{age=1, name='小贺', length=1}
//age为私有
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
age.set(o,174);
System.out.println(o);//Student{age=174, name='小贺', length=1}
Class获取成员方法并引用
Student类成员函数
public int method(String s)
{
System.out.println(s);
return 111;
}
Class<?> aClass = Class.forName("Students.Student");
// Constructor<?>[] constructors = aClass.getConstructors();
// for(Constructor<?> s:constructors)
// {
// System.out.println(s);
// }
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();//
// Method[] methods = aClass.getMethods();
// for(Method m:methods)
// System.out.println(m);
Method method = aClass.getMethod("method", String.class);//参数方法名,方法参数名
Object m = method.invoke(o, "林青霞");//==o.method()
System.out.println(m);//111