现在的需求是根据类的全名。来创建对象

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反射之根据全类名创建对象的更多相关文章

  1. Tomcat底层通过全类名创建对象的实现

    示例: //com.neuedu.baier.entity.User为User类的全类名 //要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 Class<?> user ...

  2. Java反射——读取XML文件,创建对象

    读取XML文件,创建对象 config.xml <?xml version="1.0" encoding="UTF-8"?> <beans&g ...

  3. java 反射机制--根据属性名获取属性值

    1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...

  4. java获取类的全类名----类名.class.getName()的作用是获取这个类的全类名

    类名.class.getName()的作用是获取这个类的全类名

  5. Java反射机制详解

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  6. 深入解析Java反射基础

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

  7. 深入解析Java反射(1) - 基础

    深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...

  8. 深入解析Java反射

    因为本人最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回顾:什么是反射? 反射(Ref ...

  9. Java获取指定包名下的所有类的全类名的解决方案

        最近有个需求需要获取一个指定包下的所有类的全类名,因此特意写了个获取指定包下所有类的全类名的工具类.在此记录一下,方便后续查阅 一.思路         通过ClassLoader来查找指定包 ...

随机推荐

  1. 题目1440:Goldbach's Conjecture(哥达巴赫猜想)

    题目链接:http://ac.jobdu.com/problem.php?pid=1440 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  2. 第三步 Cordova 3.0(及以上版本) 添加插件

    1.使用命令生成项目 例:cordova create jy110 com.example.jy110 jy110 2.使用命令添加插件(如果报错,可能是网络问题,可以多试几次,直到成功) 例:cor ...

  3. nginx作为下载文件服务器

    1.前言 当我们希望分享自己的文件时,有多种方式,局域网可以采用共享,rtx传输,qq传输,发送到邮箱,直接u盘拷贝等等.但最简单的就是开启本地服务器,其他电脑通过网页的方式直接下载,这里介绍使用ng ...

  4. 更新jenkins插件,报错 Perhaps you need to run your container with "-Djava.awt.headless=true"?

    Configuring the Java environment variables vi ~/.bash_profile 在最后一行加入: export JAVA_OPTS=-Djava.awt.h ...

  5. 微信小游戏 50M那部分的缓存机制的使用

    一.使用 AssetsManager 灵活定制微信小游戏的缓存策略 官网教程:http://developer.egret.com/cn/github/egret-docs/Engine2D/mini ...

  6. FAX modem和传真协议简介

    FAX就是传真,传真通信是使用传真机,借助公用通信网或其他通信线路传送图片,文字等信息,并在接收方获得发送原件系统的副本的一种通信方式.传真通信是现代图像通信的重要组成部分,它是目前采用公用电话网传送 ...

  7. Office word 2007不能另存为pdf格式的解决方法

    我们在使用Office word 2007时,经常会使用到另存为 PDF 或 XPS(P),遗憾的是,很多人都找不到这个选项, 或者在安装word的时候,并没有安装该加载项,需要你在后期安装,我们来怎 ...

  8. Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置

    在Thinkphp框架下根目录打开index.php 在头部加入如下代码即可: //入口文件 define('DOMAIN','abc.com');//abc.com换成自己的跟域名 //以下两行是为 ...

  9. nginx中location、rewrite用法总结

    一.location用法总结 location可以把不同方式的请求,定位到不同的处理方式上. 1.location的用法 location ~* /js/.*/\.js 以 = 开头,表示精确匹配:如 ...

  10. 对Yii2中 yii\web\User的理解,和自建的app\models\User(基础版),frontend\models\User的应用原理

    yii\web\User 是一个统称,为用户,没有具体实例,只能管理: 此处以app\models\User为基准: app\models\User 是映射数据表user的model类,同时也实现接口 ...