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

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

配置文件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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文内容介绍1、类加载器2、反射构造方法3、反射成员变量4、反射成员方法5、反射配置文件运行类中的方法 01类加载...
    乘风破浪的姐姐阅读 776评论 0 5
  • 此篇,没有意义,仅此纪念这个拿自己没办法,夜晚情绪泛滥的小女孩。 说小也不小了,高中生都不愿叫姐姐了。也许真的到了...
    听卡农的小仙女阅读 217评论 0 0
  • 今天来说说他吧, 我的青春里都是他。 因为他,点亮了我的高中生涯,每一丝每一毫都没忘记过,所有回忆都印象深刻,为的...
    秦簪阅读 272评论 0 0
  • 同哥的文字着实满满的正能量,马上考科目二了,心情无比紧张。感觉比任何考试还有压力,有时候练完车回来累瘫在沙发上直呼...
    汝鑫阅读 310评论 1 1
  • 道上慢点,别开那么快, 让我看下,认出那是什么品牌的车 都走了,别再等了, 车道上的车,不会说“再来” 等不及的事...
    李科岩阅读 241评论 0 0

友情链接更多精彩内容