Java的反射机制以及常用案例

反射是Java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。
例如它允许一个Java的类获取他所有的成员变量和方法并且显示出来。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。(来自Sun)

要想解析一个类,必须先要获取到该类的字节码文件对象。而解析使用的就是Class类中的方法.
所以先要获取到每一个字节码文件对应的Class类型的对象

  1. 反射的使用场景
    几乎各类框架都在使用Java反射机制,对框架的功能进行增强,通常是跟JDK的动态代理或者其他动态代理技术一起使用,例如:hibernate框架的延迟加载;spring框架的IOC和AOP;数据源驱动加载等

  2. 获取Class对象的三种方式

// 方式一: 通过Object类中的getObject()方法
Person p = new Person();
Class c = p.getClass();

// 方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。
Class c2 = Person.class;

/**
 1. 方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。
 2. 若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来
*/
Class c3 = Class.forName("com.demo.Person");
l 注意:第三种和前两种的区别
前两种你必须明确Person类型.
后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了
  1. 反射Demo代码:
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射demo
 */
public class ReflectDemo {
     

    public static void main(String args[]) {
     
        try {
     
            Class c = Class.forName("com.liang.reflection.DemoObject");
            // 获取成员方法
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++){
     
                System.out.println(m[i].toString());
            }

            // 反射获取方法并调用方法
            Method method= c.getMethod("test",null);
            Object obj1 = method.invoke(c.newInstance(),null);
            System.out.println("反射获取方法并调用方法:" + obj1);

            // 获取所有定义的成员属性
            // private的成员变量必须使用getDeclaredField,并setAccessible(true),否则看得到拿不到
            Field[] priFields = c.getDeclaredFields();
            for (int i = 0; i < priFields.length; i++) {
     
                System.out.println(priFields[i].toString());
            }

            // 获取公共成员属性
            Field[] pubFields = c.getFields();
            for (int i = 0; i < pubFields.length; i++) {
     
                System.out.println(pubFields[i].toString());
            }

        } catch (Throwable e) {
     

            System.err.println(e);

        }
    }
}

/**
 * Created by.
 *
 * @author:
 * @date: 2020-05-03 13:13
 * @description:
 */
public class DemoObject {
     
    public String address;
    private String name;
    private int age;

    public static void main(String[] args) {
     
        System.out.printf("test:" + test());
        System.out.printf("test2:" + test2());
    }
    public static int test() {
     
        try {
     
            System.out.println("execute test()");
            return 1;
        } catch (Exception e) {
     

        } finally {
     
            return 2;
        }
    }
    public static int test2() {
     
        int arr[] = new int[1];
        try {
     
            arr[0] = 1;
            return arr[0];
        } catch (Exception e) {
     

        } finally {
     
            arr[0] = 2;
            return arr[0];
        }
    }
    public int test3() {
     
        int arr[] = new int[1];
        try {
     
            arr[0] = 1;
            return arr[0];
        } catch (Exception e) {
     

        } finally {
     
            arr[0] = 2;
            return arr[0];
        }
    }
}

-------------欢迎各位留言交流,如有不正确的地方,请予以指正。【Q:981233589】

你可能感兴趣的:(源码研究,JavaCore,springboot,java,反射,class,反射原理,动态代理)