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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java学习:反射
反射 使用反射可以直接获取class字节码文件中的类型、属性、方法。 演示代码: 新建一个名为User的类作为反射的操作对象 public class User { private int id; private String name; private String password; public User() { } /** * @return the id */ public int getId() { return id; } /** * @return the name */ public String getName() { return name; } /** * @return the password */ public String getPassword() { return password; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @param name the name to set */ public void setName...
-
下一篇
网站有漏洞被攻击篡改了数据该怎么修复解决
2019年1月14日消息,thinkphp又被爆出致命漏洞,可以直接远程代码执行,getshell提权写入网站木马到网站根目录,甚至直接提权到服务器,该漏洞影响版本ThinkPHP 5.0、ThinkPHP 5.0.10、ThinkPHP5.0.12、ThinkPHP5.0.13、ThinkPHP5.0.23、thinkphp 5.0.22版本。 攻击者可以伪造远程恶意代码,对服务器进行post提交数据来利用漏洞,该漏洞产生的原因是继上次2019元旦前后爆出的网站漏洞后,又一次的致命漏洞。在thinkphp目录下的library文件夹下的thinkrequest.php代码。如下图所示: 从上述代码中可以看出整个代码写的流程,首先打开网站会从app.php代码里将请求的网站地址使用check来进行解析,然后再经过patch类型对其进行深度的赋值.然后可以使用post方式提交数据到_method函数当中去,框架会对进行判断,然后对其调用传入的参数值,经过整个代码的循坏以及传入,就可以导致request的值给覆盖掉,从而产生远程代码执行,我们来构造恶意的代码,看看漏洞是如何使用的。 pos...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器