java类的反射

来源:互联网 发布:网络攻击鱼叉 水坑 编辑:程序博客网 时间:2024/06/05 06:33

即反编译,基本上都是框架会使用反射.比如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());
原创粉丝点击