java反射:框架设计的灵魂

Java反射机制详解
本文深入讲解Java反射机制,包括反射的基本概念、Java代码的三个阶段、反射的好处以及如何获取Class对象。此外,还介绍了Class对象的使用方法,包括获取成员变量、构造方法和成员方法等。

反射的概念
将类的各个部分封装为其他对象,这就是反射机制
Java代码在计算机中经历的三个阶段
第一阶段:Source源代码阶段
首先写出.java文件,经过编译生成.class字节码文件,由三个比较重要的部分:
1.成员变量,2.构造方法,3.成员方法
第二阶段:Class类对象阶段
类加载器将字节码文件加载到内存中
有一个对象来描述这个字节码文件,就是Class类对象
在Class类对象中,成员变量被封装为Field对象,构造方法被封装为Constructor对象,成员方法被封装为Method对象。
还有第三阶段(Runtime运行时阶段)
就是创建了一个对象
反射的好处
1.在程序运行中操作这些对象
2.解耦,提高可扩展性
获取class对象的方式
在第一阶段:
Class.forName(“全类名”);字节码文件加载进内存,返回class对象
在第二阶段:
类名.class:通过类名的属性class获取
在第三阶段:
对象.getClass(),这个方法在object里被定义

public class reflectDemo {
    /*
    获取class对象的方式:
    在第一阶段:
    Class.forName("全类名");字节码文件加载进内存,返回class对象
    多用于配置文件,传的是字符串
    在第二阶段:
    类名.class:通过类名的属性class获取
    多用于参数的传递
    在第三阶段:
    对象.getClass(),这个方法在object里被定义
    多用于对象获取
     */
    public static void main(String[] args) throws ClassNotFoundException {
        // Class.forName("全类名");
        Class clase1 =  Class.forName("human.Person");
        System.out.println(clase1);

        //类名.class
        Class clase2 = Person.class;
        System.out.println(clase2);

        //对象.getClass()
        Person p1 = new Person();
        Class clsse3 = p1.getClass();
        System.out.println(clsse3);

        System.out.println(clase1 == clase2);
        System.out.println(clase2 == clsse3);
    }
}

输出结果:
class human.Person
class human.Person
class human.Person
true
true
我们可以得到一个结论:
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方法获取的类对象都是同一个。

class对象的使用
*获取功能
1.获取成员变量们
Field[] getFields()//获取public的成员变量
Field getField(String name)//获取指定名称的public的成员变量

Field[] getDeclaredFields()//所有的成员变量
Field getDeclaredField(String name)//指定名称的,但是访问私有的会报错,你需要先d.setAccessible(true)//暴力反射
2.获取构造方法们
Constructor[] getConstruetors()
Constructor getConstructor(类<?>… parameterTypes)

Constructor[] getDeclaredConstruetors()
Constructor getDeclaredConstructor(类<?>… parameterTypes)
3.获取成员方法们,和成员变量差不多
Method[] getMethods()//object类里边的方法也会被打印出来
Method getMethod(String name,类<?>…parameterTypes)//后面写的是参数的类型,例如String.class

Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,类<?>…parameterTypes)
4.获取类名
String getName()
类对象.getName()
Field的使用
Field.get(对象)
Field.set(对象,value)
Constructor的使用
创建对象:
constructor.newInstance(,);
如果使用空的参数的构造方法来创建对象,操作可以简化:Class对象的newInstance()方法
Method的使用
执行方法
Method.invoke(对象,参数);
获取方法的名称
Method.getname();
小例子
创建一个“框架”,在不改变其代码的情况下执行任意类的方法

public class reflectDemo {

    public static void main(String[] args) throws Exception {
       //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,使其成为一个集合
        ClassLoader classLoader = reflectDemo.class.getClassLoader();//获取该类的类加载器
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);
        //2.获取配置文件中的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");
        //3.加载这个类进内存
        Class clase = Class.forName(className);
        //4.创建对象
        Object obj = clase.newInstance();
        //5.获取方法对象
        Method method = clase.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);
    }
}

每日一问
idea快捷键有哪些

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值