代码的魔法师:Java反射工厂模式详解

简介: 代码的魔法师:Java反射工厂模式详解

定义实体类

package world.xuewei;
/**
 * 用户实体
 *
 * @author 薛伟
 * @since 2023/9/14 17:17
 */
public class User {
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String password;
    public User() {
    }
    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

定义服务接口

package world.xuewei;
/**
 * 用户服务接口
 *
 * @author 薛伟
 * @since 2023/9/14 17:17
 */
public interface UserService {
    /**
     * 用户登录
     *
     * @param userName 用户名
     * @param password 密码
     * @return 登录用户
     */
    User login(String userName, String password);
}

定义服务实现类

package world.xuewei;
/**
 * 用户服务接口实现类
 *
 * @author 薛伟
 * @since 2023/9/14 17:19
 */
public class UserServiceImpl implements UserService {
    @Override
    public User login(String userName, String password) {
        System.out.println("当前登录用户为:" + userName);
        return new User(userName, password);
    }
}

定义工厂类

package world.xuewei;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 工厂类
 *
 * @author 薛伟
 * @since 2023/9/14 17:23
 */
public class BeanFactory {
    /**
     * 存储配置文件内容
     */
    private static final Properties properties = new Properties();
    static {
        // 加载配置文件内容
        try (InputStream inputStream = BeanFactory.class.getResourceAsStream("/bean.properties")) {
            properties.load(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 获取 Bean 对象
     *
     * @return 服务实现类
     */
    public static Object getBean(String beanName) {
        Object bean = null;
        try {
            // 通过全限定类名反射创建对象
            Class<?> userServiceClass = Class.forName(String.valueOf(properties.get(beanName)));
            bean = userServiceClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

测试方法

package world.xuewei;
/**
 * 主方法
 *
 * @author 薛伟
 * @since 2023/9/14 17:21
 */
public class MainApp {
    public static void main(String[] args) {
        UserService userService = (UserService) BeanFactory.getBean("userService");
        userService.login("张三", "123456");
    }
}

配置文件

# bean.properties
userService=world.xuewei.UserServiceImpl


相关文章
|
3天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
4天前
|
设计模式 Java Spring
来聊聊Java的反射机制(下)
来聊聊Java的反射机制(下)
7 0
|
5天前
|
SQL Java 数据库
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
10 1
|
5天前
|
安全 Java 开发者
Java编程:深入探索其原理、特性与实战代码
Java编程:深入探索其原理、特性与实战代码
10 1
|
6天前
|
存储 算法 Java
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
【4月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
19 1
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
|
6天前
|
Java
Java 反射
Java 反射
|
6天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
6天前
|
存储 Java Shell
深入剖析Java中的反射,由浅入深,层层剥离!
深入剖析Java中的反射,由浅入深,层层剥离!
11 1
|
9天前
|
Java 测试技术 持续交付
云效产品使用常见问题之通过流水线构建的java代码,在docker文件里拿到失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
11天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。