04-反射-Java的精髓-v1

Java精髓是反射,反射的巨大威力在: 反射➕泛型,反射➕注解中显得淋漓尽致,非常的简约典雅,打造高可用的模式。

Annotation-新的开发技术结构。

  1. 根据实例对象找到所属类型,找到根源。
  2. 反射中所有的核心操作都是围绕Class类展开的。
  3. Class代表的对象有类,抽象类,接口,基本数据类型class(int.class)

获取指定Class的三种方式

  1. 通过对象实例获取Class,特点:是需要有对象实例。(获取实例对象的类的根源信息)
  2. JVM直接支持的**“类.class”**形式的实例化。
  3. Class类有一个静态方法forName来获取Class实例化,特点: 以字符串(为权限命名)的形式来获取指定的类型,不需要import该类来获得Class,解耦合,降低到了import级别。

对象反射实例化

通过反射获取实例化对象,newInstance;(反射世界中的newInstance相对于平常编写代码中的new)–newInstance 在jdk1.9之后被废除,原因是它只会调用无参构造函数。

工厂模式为接口实例化

工厂模式解耦合(子类与客户端的解耦)

静态工厂模式以字符串作为参数判断来返回指定的实例化对象,但是如果子类不断增多,那么每次都要修改静态工厂,原因是需要new,new 需要硬编码对象的名称。

public class StaticFactory {
    /**
     * 缺点:当有新的子类出现时需在这里手动添加修改代码
     */
    public static IMessage getMessageInstance(String name){
        IMessage instance = null;
        if("NetMessage".equals(name)){
            instance = new NetMessage();
        }else if("CloudMessage".equals(name)){
            instance = new CloudMessage();
        }
        return instance;
    }
}

静态工厂场景模拟

public class Main {
    public static void main(String[] args) {
        IMessage msg = StaticFactory.getMessageInstance("NetMessage");
        msg.message();
        msg = StaticFactory.getMessageInstance("CloudMessage");
        msg.message();
    }
}
/**
 【网络消息】:Hello :)
 【云消息】:Hello :)
 */

动态工厂模式:newInstance的出现可以不用硬编码类名称,只需要根据客户端传入的权限命名字符串即可,在以后增加子类的过程中,完全不用修改动态工厂。

/**
 * 动态工厂模式
 */
public class DynamicFactory {

    public static IMessage getMessageInstance(String name){
        IMessage instance = null;
        try {
            // 通过反射newInstance来获取实例化对象
           instance = (IMessage) Class.forName(name).newInstance();
        }catch(Exception e){}
        return instance;
    }
}

动态工厂场景模拟

public class Main {
    public static void main(String[] args) {
        // 注意这里传入的是权限命名
        IMessage msg = DynamicFactory.getMessageInstance("org.hzz.NetMessage");
        msg.message();
        msg = DynamicFactory.getMessageInstance("org.hzz.CloudMessage");
        msg.message();
    }
}
/**
 【网络消息】:Hello :)
 【云消息】:Hello :)
 */

反射➕泛型

为不同的接口实例化

打造高可用的工厂模式

在这里插入图片描述

/**
 * 高可用的工厂模式
 */
public class Factory {
    /**
     * 获取接口的实例化对象
     * @param name  权限命名
     * @param clazz 外部调用传入,用于泛型处理
     * @param <T>
     * @return
     */
    public static<T> T getInstance(String name,Class<T> clazz){
        T instance = null;
        try{
            instance = (T)Class.forName(name).newInstance();
        }catch (Exception e){}
        return instance;
    }
}

高可用的工厂模式场景模拟

public class Main {
    public static void main(String[] args) {
        // 注意这里传入的是权限命名,以及Class,这里是接口的class
        IMessage msg = Factory.getInstance("org.hzz.NetMessage",IMessage.class);
        msg.message();
        msg = Factory.getInstance("org.hzz.CloudMessage",IMessage.class);
        msg.message();

        IService srv = Factory.getInstance("org.hzz.HourseSerVice",IService.class);
        srv.service();
        srv = Factory.getInstance("org.hzz.CoffeeService",IService.class);
        srv.service();
    }
}
/**
 【网络消息】:Hello :)
 【云消息】:Hello :)
 【租房服务】: Hello :)
 【咖啡服务】: Hello :)
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值