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来查找指定包 ...
随机推荐
- jquery validate 多种使用方式
前言:jQuery.validator是一款非常不错的表单验证插件,验证方式非常简单方便,它还对HTML5做了兼容处理,了解了验证规则,就基本掌握了它的使用,下面就让我一一道来 jQuery.vali ...
- Build step 'Execute Windows batch command' marked build as failure
坑爹的Jenkis,在执行windows命令编译.NET项目的时候命令执行成功了,但是却还是报了这样一个错: Build step 'Execute Windows batch command' ma ...
- [SharePoint 2010] SharePoint 2010 部署、收回和删除解决方案----STSADM和PowerShell
STSADM stsadm -o addsolution –filename c:\bin\CustomerSiteSearch.wsp stsadm -o deploysolution –name ...
- [移动] Xamarin install
It was not possible to complete an automatic installation. This might be due to a problem with your ...
- iOS uitextfield长度限制
[textUsername addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEd ...
- Java虚拟机六 堆溢出的处理
在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM. Exception in thread "main" java.lang.Out ...
- Spark ML包,数据挖掘示例数据Affairs
1.数据字段解释 affairs:一年来婚外情的频率 gender:性别 age:年龄 yearsmarried:婚龄 children:是否有小孩 religiousness:宗 ...
- &与&&, |与||区别
&和|称为短逻辑符,&&及||称为长逻辑符.长逻辑符只比较左边和右边的第一个元素,而短逻辑符会比较所有的 > a<-c(TRUE, FALSE, TRUE, FAL ...
- python----题库(一)
1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py #必须在首行有 #!/usr/bin/env pyth ...
- flask数据库操作
Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...