版权声明:知识共享 https://blog.csdn.net/liyaowen505/article/details/78220576
即反编译,基本上都是框架会使用反射.比如Spring。
首先新建一个Person类,。
package com.hui.reflect;
public class Person {
private String name;
private String age;
public Person() {
}
public Person(String name,String age) {
this.name = name;
this.age = age;
}
get...set...
@Author({"lisi","zhangsan"})
public void readBook(){}
}
在测试类中实验:
反射步骤:
1、 获取类的全路径
String className = "com.hui.reflect.Person";
2、 获取类的字节码文件
Class<?> clazz= Person.class;
或者
Class<?> clazz = Class.forName(className);
3、获取Person的实例化对象p
// 走无参构造
Person p = (Person) clazz.newInstance();
System.out.println(p);
// 走有参构造
Constructor<?> constructor = clazz.getConstructor(String.class,String.class);// 参数的类型
Person p2 = (Person) constructor.newInstance("jack", "23");
System.out.println(p2.getName());
4、获取类中的字段
// Field[] fields = clazz.getFields(); //获取公有的所有字段
Field[] declaredFields = clazz.getDeclaredFields(); // 获取私有的所有字段
for (Field field : declaredFields) {
// 设置权限强制访问
field.setAccessible(true);
String name = field.getName(); // 获取字段的名字
String value = (String) field.get(p2); // 从p2对象中获取该字段的值
System.out.println(name + ".." + value);
}
5、获取类中的方法
// Method[] declaredMethods = clazz.getDeclaredMethods(); //获取所有方法,包括私有,可以遍历
Method getName = clazz.getDeclaredMethod("getName");//获取指定的方法
String result = (String) getName.invoke(p2);//获取该方法的返回值
System.out.println(result);
6、获取方法注解的值
Method readBook = clazz.getMethod("readBook");
// Annotation[] annotations = readBook.getAnnotations(); //获取此方法的所有注解
// for(Annotation anno:annotations){
// System.out.println(anno.toString());
// }
Annotation annotation = readBook.getAnnotation(Author.class);
System.out.println(annotation.toString());