java反射浅谈 part1--反射机制的定义,作用,原理

一.定义

  在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;还可以通过反射创建对象,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

二.能做什么

1.在运行时判断任意一个对象所属的类

2.在运行时构造任意一个类的对象

3.在运行时判断任意一个类所具有的成员变量和方法

4.运行时调用任意一个对象的方法

5.生成动态代理

三.原理,通过例子说明

public class Test {

    public static void main(String[] args) {
        //指定类名
        String className = "com.template.Runable.testHello";
        testHello test = null;
        try {
            //用类名根据反射创建实例,并调用实例的方法
            Class th = Class.forName(className);
            test = (testHello)th.newInstance();
            test.main(null);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}

结果:  输出了我指定类里面的main函数

从执行过程说原理

  Class.forName(classname):调用

forName0(className, true, ClassLoader.getClassLoader(caller), caller)
className:类名
true:初始化该类
ClassLoader.getClassLoader(caller):获取当前类加载器
caller:当前类

  解释:要想使用类,必须使用类加载器进行加载,类加载器先检查自己是否已经加载过该类,加载过:直接返回,没有:调用父类的loadClass方法,父类中没有,执行findClass()去尝试从生成的.class文件加载此类,主要通过defineClass()完成,将字符数组转换成Class类,这种转换的类需要通过newInstance去创建实例,不能通过new Class实例化,注:反射是有缓存的,不会每次都去重新反射。

  

  

原文地址:https://www.cnblogs.com/jijiji/p/7011405.html