java反射之根据全类名创建对象
现在的需求是根据类的全名。来创建对象
package 中介者设计模式;
import java.util.Date;
public class CreateObject {
public static void main(String[] args) {
Object obj = createInstance("java.util.Date");
System.out.println(obj);
Date d = createInstance(Date.class);
System.out.println(d);
}
//提供一个方法,根据传入的参数全名创建一个对象并且返回
public static Object createInstance(String className){
try {
Class clz = Class.forName(className);
Object obj = clz.newInstance();
return obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//重载的方法(这个方法还是没有解决问题)
public static <T> T createInstance(Class<T> clz){
try {
return clz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//传递一个类的全新类名来调用对象,将上述两种方案进行合体
public static <T> T createInstance(Class<T> checkType,String className){
try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要检查checkType是不是obj的字节码对象
if (!checkType.isInstance(obj)) {
throw new Exception("对象跟字节码不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Spring也是这样做的。我们把公用的代码封装到一个工具类中,就可以了。
package 中介者设计模式;
//对象工厂
public class BeanFactory { //传递一个类的全新类名来调用对象,将上述两种方案进行合体
public static <T> T getBean(Class<T> checkType,String className){ try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要检查checkType是不是obj的字节码对象
if (!checkType.isInstance(obj)) {
throw new Exception("对象跟字节码不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} }
大家都知道工厂的设计模式是单例的设计模式:
单例的设计模式写法有好几种形式比如1:枚举方法创建工厂射进模式
package 中介者设计模式;
//对象工厂
public enum BeanFactory {
//传递一个类的全新类名来调用对象,将上述两种方案进行合体
INSTANCE;
public <T> T getBean(Class<T> checkType,String className){ try {
Class<T> clz = (Class<T>)Class.forName(className);
Object obj = clz.newInstance();
//需要检查checkType是不是obj的字节码对象
if (!checkType.isInstance(obj)) {
throw new Exception("对象跟字节码不兼容");
}
return (T)obj;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
} } 外界是怎么调用这个方法那,BeanFactory.INSTANCE.getBean();就行了是不是很简便啊 。
java反射之根据全类名创建对象的更多相关文章
- Tomcat底层通过全类名创建对象的实现
示例: //com.neuedu.baier.entity.User为User类的全类名 //要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 Class<?> user ...
- Java反射——读取XML文件,创建对象
读取XML文件,创建对象 config.xml <?xml version="1.0" encoding="UTF-8"?> <beans&g ...
- java 反射机制--根据属性名获取属性值
1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...
- java获取类的全类名----类名.class.getName()的作用是获取这个类的全类名
类名.class.getName()的作用是获取这个类的全类名
- Java反射机制详解
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
- 深入解析Java反射(1) - 基础
深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...
- 深入解析Java反射
因为本人最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回顾:什么是反射? 反射(Ref ...
- Java获取指定包名下的所有类的全类名的解决方案
最近有个需求需要获取一个指定包下的所有类的全类名,因此特意写了个获取指定包下所有类的全类名的工具类.在此记录一下,方便后续查阅 一.思路 通过ClassLoader来查找指定包 ...
随机推荐
- Email standards
https://www.fastmail.com/help/technical/standards.html Email structure These RFCs define the way ema ...
- android cannot locate symbol 'sigemptyset'问题解决
设备是android 4.1的平板电脑,支持armeabi-v7a和mips,为了能用上poco c++ lib,用cmake编译了poco mips架构的lib,但在android studio里引 ...
- Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析
1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"} ...
- 题目1144:Freckles(最小生成树进阶)
题目链接:http://ac.jobdu.com/problem.php?pid=1144 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- 【CF900D】Unusual Sequences 容斥(莫比乌斯反演)
[CF900D]Unusual Sequences 题意:定义正整数序列$a_1,a_2...a_n$是合法的,当且仅当$gcd(a_1,a_2...a_n)=x$且$a_1+a_2+...+a_n= ...
- 使用shell数据处理数据实例①-------手把手教学版
引子: 在工作过程中经常要处理各种小数据,同事间会用各种工具方法来处理,比如用java.python.Perl甚至用UE手工处理.但貌似不都方便. 今天举一例子使用shell来处理,来说明shell一 ...
- VSCode集成TypeScript编译
先安装github客户端和nodeJS客户端吧,直接去官网下载,nodeJS客户端安装完就集成了npm; 查看是否成功: git version node -v npm-v 安装TypeScript ...
- Spark2 broadcast广播变量
A broadcast variable. Broadcast variables allow the programmer to keep a read-only variable cached o ...
- 9.13Django ORM那些事
2018-9-13 14:23:22 ORM那些事 参考 : https://www.cnblogs.com/liwenzhou/p/8660826.html 今天的都是ORM的查询 更详细进阶了! ...
- ELK之生产日志收集构架(filebeat-logstash-redis-logstash-elasticsearch-kibana)
本次构架图如下 说明: 1,前端服务器只启动轻量级日志收集工具filebeat(不需要JDK环境) 2,收集的日志不进过处理直接发送到redis消息队列 3,redis消息队列只是暂时存储日志数据,不 ...