`

Class.forName(java工厂设计模式)

 
阅读更多

Class.forName(xxx.xx.xx) 返回的是一个类

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。

关于补充的问题
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

Class.forName(xxx.xx.xx) 返回的是一个类
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象
String str = 用户输入的字符串
Class t = Class.forName(str);
t.newInstance();

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。

分享到:
评论

相关推荐

    java中Class.forName的作用浅谈

    在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...

    jdbc中class.forname的作用

    在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...

    java 反射工厂模式

    工厂类可以有一个`createObject(String className)`方法,接收类名作为参数,然后使用`Class.forName()`和`newInstance()`来创建对象。 ```java public class DynamicFactory { public static Object createObject...

    forname实现工程内部反射机制

    这种灵活性在许多场景下都是宝贵的,例如在设计模式如工厂方法、策略模式或动态代理中。 总之,通过`Class.forName()`方法,我们可以实现在工程内部的反射机制,动态地访问和操作任何已知类,不论它们位于哪个包中...

    jdbc.rar_java 工厂 程序_jdbc_oracle_oracle 操作

    - 加载驱动:`Class.forName("oracle.jdbc.driver.OracleDriver")` - 获取连接:`Connection conn = DriverManager.getConnection(url, username, password)` - 创建Statement或PreparedStatement对象 - 执行SQL...

    java工厂系列设计模式源码与文档

    public class ClassXmlPathApplicationContext implements BeanFactory { ... map.put(id, Class.forName(clazz).newInstance()); } } @Override public Object getBean(String id) { return map.get(id); }

    JAVA反射机制-Class类-Class对象的获取.pdf

    `Class`类还提供了一个静态方法`forName`,可以根据类的全限定名获取`Class`对象。 ```java Class<?> clazz = Class.forName("org.whatisjava.reflect.Foo"); ``` 如果指定的类尚未被加载,则此方法会先加载...

    利用java反射原理实现工厂模式

    在Java编程中,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式通过定义一个工厂接口以及其实现类来创建特定类型的对象,然而,这种模式在面对需求变化时可能显得不够灵活。...

    Java与设计模式用例

    Class c = Class.forName(className); return (Sample) c.newInstance(); } } ``` ##### 工厂方法模式(Factory Method Pattern) 工厂方法模式是工厂模式的一种变体,它的主要特点是定义了一个创建对象的接口...

    反射简单工厂

    简单工厂模式是一种设计模式,它提供了一个创建对象的公共接口,而无需指定具体的类。将反射与简单工厂模式结合使用,可以实现更加灵活的代码,特别是在需要动态创建和调用不同类的对象时。下面我们将深入探讨这两个...

    652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652).rar

    - `Class.forName(String className)`:通过类名获取Class对象。 - `类名.class`:在类实例或类名后面加上`.class`也可以得到该类的Class对象。 - `某个对象.getClass()`:通过对象实例获取其Class对象。 4. **...

    java 连接各类数据库

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...

    JAVA操作数据库方式与设计模式应用.txt

    ### Java操作数据库方式与设计模式应用 #### 一、Java操作数据库基础:JDBC **JDBC(Java Database Connectivity)**是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写...

    重难点之java工厂类.pdf

    工厂类模式是Java编程中一种常用的创建型设计模式,它的主要目的是将对象的创建与使用分离。这样做的好处是可以在不修改使用对象的代码的情况下,引入新的对象创建方式或者新的对象种类。工厂类模式主要包含简单工厂...

    Java Dao设计模式操作数据库

    Java DAO(Data Access Object)设计模式是一种常用的软件设计模式,用于在Java应用程序中与数据库进行交互。DAO模式的主要目的是为了实现数据访问层的隔离,它将业务逻辑与数据存储细节分离开来,使得代码更加模块...

    二十三种设计模式【PDF版】

    所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的灵魂),编程工作将变成一个让你时刻 体验创造快感的激动人心的过程. 为能和大家能共同探讨"设计模式",我将自己在学习中的心得...

    Java常用包

    * forName()方法:返回指定类的Class对象 * getConstructor()方法:返回指定构造方法 * getDeclaredConstructor()方法:返回指定声明的构造方法 * getDeclaredField()方法:返回指定声明的字段 * getField()方法:...

    笔试Java3.doc

    20. Class.forName 的作用:Class.forName 方法可以用于加载类,并返回对应的 Class 对象。 21. 内存泄漏:内存泄漏是指在 Java 中的一种问题,指的是对象无法被垃圾回收机制回收,从而导致内存溢出。 JavaBean 和...

Global site tag (gtag.js) - Google Analytics