java类的反射

版权声明:知识共享 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());

猜你喜欢

转载自blog.csdn.net/liyaowen505/article/details/78220576