反射的基本作用
在运行时获得类的字节码文件对象,并且可以解析类的构造器、成员变量、方法
反射的核心思想和关键
得到编译以后的class文件
1、获取class对象
public class Test {
public static void main(String[] args) throws Exception {
//1 、Class 中的一个静态方法 forname("包名+类名")
Class c = Class.forName("com.tyz.Student");
System.out.println(c);
//2、类名.class
Class c1 = Student.class;
System.out.println(c1);
//3、对象.getclass()
Class c2 = new Student().getClass();
System.out.println(c2);
}
}
2.1、获取构造器
//1、通过类对象.getConstructors()==》获取public修饰的构造器数组
Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//2、通过类对象.getConstructor==》获取public修饰的构造器
Constructor constructor = c.getConstructor(String.class,int.class);
System.out.println(constructor);
//3、通过类对象.getDeclaredConstructor==》获取构造器
Constructor constructor = c.getDeclaredConstructor(String.class,int.class);
System.out.println(constructor);
//4、通过类对象.getDeclaredConstructors==》获取构造器数组
Constructor[] constructors = c.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
2.2、调用构造器
//构造器.newInstance();
Constructor constructor = c.getDeclaredConstructor(String.class,int.class);
Student s = (Student) constructor.newInstance("黎明",22);
constructor.setAccessible(true);//可访问权限转public(1次),破坏了封装性
3、获取成员变量
//1、类对象.getDeclaredFields获取成员变量数组
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
System.out.println(field.getType());
}
//2、类对象.getDeclaredField获取指定的成员变量
Field age = c.getDeclaredField("age");
System.out.println(age);
//3、为成员变量赋值
age.setAccessible(true);
age.set(student,33);
System.out.println(student);
//4、取值
age.get(student);
4、获取方法对象
Method method = c.getDeclaredMethod("getName");
System.out.println(method.getName() + method.getReturnType() + method .getParameterCount());
method.invoke(s);//调用该方法invoke
Method[] methods = c.getDeclaredMethods();
for (Method method1 : methods) {
System.out.println("方法名:"+method1.getName() + "返回值类型:"+method1.getReturnType() +" 参数个数"+method1.getParameterCount());
}