反射机制及原理

本文介绍了如何通过Java反射API在ReflectionQuestion类中根据配置文件re.properties动态调用com.hspedu.Cat类的hi或cry方法,展示了反射机制在扩展性和灵活性上的优势。
摘要由CSDN通过智能技术生成

引出反射机制的要求:
首先有一个配置文件:re.properties

classfullpath=com.hspedu.Cat
method=hi

然后我们需要在reflection.question这包下面的ReflectionQuestion类去访问到配置文件里面的hi方法。
思考怎么做?
来,我们先建项目
在这里插入图片描述
配置文件:
名称:re.properties

classfullpath=com.hspedu.Cat
method=hi

com.hspedu包下的Cat类:

package com.hspedu;

public class Cat {
    private String name="招才猫";
    public void hi(){
        //
        System.out.println("hi"+name);
    }
}

reflection.question包下的ReflectionQuestion类


public class ReflectionQuestion {
    public static void main(String[] args) throws Exception {
        根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi

        //传统方式 new 对象
       /* Cat cat = new Cat();
        cat.hi();*/

        //1.使用Properties 类,可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath = "+classfullpath);
        System.out.println("method = "+methodName);

        //2.使用这个方法创建对象,行不通。那么我们使用反射机制

        //(1).加载类,返回Class类型的对象
        Class aClass = Class.forName(classfullpath);
        //(2) 通过aClass 得到加载的类 com.hspedu.Cat 的对象实例
        Object o = aClass.newInstance();
        System.out.println(o.getClass());//class com.hspedu.Cat
        /*Cat cat=(Cat) o;
        cat.hi();

         */
//通常我们并不知道里面的方法名称,所以此方法不可用
        //(3)通过 aClass 得到你加载的类 com.hspedu.Cat 的 methodName "hi" 的方法对象
        // 即,在反射中,可以把方法视为对象(万物皆对象)
        Method method1 = aClass.getMethod(methodName);
        //(4.通过method1 调用方法:即通过方法来实现调用方法)
        System.out.println("=============");
        method1.invoke(o);//传统 对象.方法() ,反射机制  方法 .invoke(对象)
    }
}

用这个方法似乎更麻烦了?平时我们通过new 对象就好了,现在还需要写这么多。其实不然。
试想如果我们再添加一个方法呢?

package com.hspedu;

public class Cat {
    private String name="招才猫";
    public void hi(){
        //
        System.out.println("hi"+name);
    }

    public void cry(){
        //
        System.out.println("miaoo~~miao~~"+name);
    }
}

添加方法后我们使用传统的方法只能去改代码

 Cat cat = new Cat();
     //   cat.hi();
//改为
cat.cry();

但是如果我们用了反射现在只要去改配置文件

classfullpath=com.hspedu.Cat
method=cry

反射机制原理图
在这里插入图片描述
在图中的类加载器这一块是JVM java底层的知识,在面试中经常会问,,但是实际应用是我们圈出来标有应用的这一块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值