Java学习:反射的应用,依赖加载

简介: 使用反射实现从配置文件加载类以及根据配置文件解决特定依赖关系。配置文件reflect.properties:1AdminDao=reflect.AdminDao1GuestDao=reflect.

使用反射实现从配置文件加载类以及根据配置文件解决特定依赖关系。

配置文件reflect.properties

1AdminDao=reflect.AdminDao
1GuestDao=reflect.GuestDao
1Manager=reflect.Manager
2Manager:AdminDao
2Manager:GuestDao

对应类文件AdminDao

package reflect;

public class AdminDao {
    public AdminDao(){
        System.out.println("成功实例化AdminDao");
    }
    
}

对应类文件GuestDao:

package reflect;

public class GuestDao {
    public GuestDao(){
        System.out.println("成功实例化GuestDao");
    }
}

对应类文件Manager:

package reflect;

public class Manager {
    private AdminDao adminDao = null;
    private GuestDao guestDao = null;
    public Manager() {
        System.out.println("Manage实例化成功");
    }
    public void setAdminDao (Object o) {
        this.adminDao = (AdminDao)o;
        System.out.println("解决adminDao依赖");
    }
    public void setGuestDao (Object o) {
        this.guestDao = (GuestDao)o;
        System.out.println("解决guestDao依赖");
    }
}

反射测试工厂类:

package reflect;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class ObjectFactory {
    public static Map<String,Object> map = new HashMap<String,Object>();
    
    static {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("src/reflect.properties"));
            String str = br.readLine();
            while(str != null) {
                char c = str.charAt(0);
                switch (c) {
                    case '1':
                        String[] arr = str.substring(1).split("=");
                        Object o = Class.forName(arr[1]).newInstance();
                        map.put(arr[0].trim().toLowerCase(), o);
                        break;
                    case '2':
                        String[] arr2 = str.substring(1).split(":");
                        Object obj = map.get(arr2[0].trim().toLowerCase());
                        Object fieldObj = map.get(arr2[1].trim().toLowerCase());
                        String methodName = "set"+arr2[1].substring(0, 1).toUpperCase()+arr2[1].substring(1);
                        Method method = obj.getClass().getDeclaredMethod(methodName, Object.class);
                        method.invoke(obj, fieldObj);
                        break;
                }
                str = br.readLine();
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    public static void main(String[] args) {
        Set<String> set = map.keySet();
        for (String string:set) {
            System.out.println(string+"--"+map.get(string));
        }
    }

}

跑起来结果:

成功实例化AdminDao
成功实例化GuestDao
Manage实例化成功
解决adminDao依赖
解决guestDao依赖
admindao--reflect.AdminDao@10d1f30
manager--reflect.Manager@7aacc1
guestdao--reflect.GuestDao@1e3cabd
相关文章
|
2月前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
84 7
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
213 3
|
1天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
19 5
|
1天前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
19 5
|
1天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
26 9
|
1天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
18 4
|
1天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
18 4
|
1天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
10 1
|
1天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
10 1
|
25天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。