Java反射机制生成实例和普通实话化对比

18 篇文章 1 订阅
7 篇文章 0 订阅
package Reflect.Peng;
/* 对比正常new对象和reflect创建对象,假设存在str_obj中对象运行中未知,从外部导入*/

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class Apple{
    private float price;
    public String type = "Iphone 100SE";

    public void setPrice(float price) {
        this.price = price;
    }

    public float getPrice() {
        return price;
    }
}

public class P0107ReflectExample {
    public static void main(String[] args)
            throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
            InvocationTargetException, InstantiationException, NoSuchFieldException {
        Apple direct_creat = new Apple();
        direct_creat.setPrice((float) 3999.5);
        System.out.println("直接创建Apple对象,调用方法:" + direct_creat.getPrice());

        //Reflect方法:forName得到导入的类型,getMethod调用方法, getConstructor构造,.instance实例化
        String str = "Reflect.Peng.Apple";
        String[] mtd = {"setPrice", "getPrice"};
        Class clazz = Class.forName(str);//throw找不到方法的异常
        Method setPr = clazz.getMethod(mtd[0], float.class); //找不到方法的异常处理
        Object reflect_obj = clazz.getDeclaredConstructor().newInstance();
        //调用设置方法
        setPr.invoke(reflect_obj, (float)5999.5);
        //调用get获取方法
        Method getPr = clazz.getDeclaredMethod(mtd[1]);
        System.out.println("反射的apple对象创建,调用方法返回结果" + getPr.invoke(reflect_obj));

        /*直接创建很方便,new一下,直接.点调用即可;
        * 反射创建看似比较复杂,需要forname得到Class类,然后对象要用getDeclaredConstructor进行newInstance,
        *                   方法需要用clazz的getMethod返回Method对象,通过invoke来执行调用; getFields获取属性
        * 然而,这种好处是对象类型和执行完全解耦了,这对于企业编程,大型程序的配置、运行分离非常关键;大为简化运行难度,提升配置灵活性;
        * 所以这称为大名鼎鼎的Spring编程的关键思想,配置、数据、运行解耦 */

        Field val = clazz.getField(clazz.getField("type").getName());
        System.out.println("变量名:" + clazz.getField("type") +
                "\nApple型号: " + val.get(reflect_obj));

    }

}

output

直接创建Apple对象,调用方法:3999.5
反射的apple对象创建,调用方法返回结果5999.5
变量名:public java.lang.String Reflect.Peng.Apple.type
Apple型号: Iphone 100SE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值