`
Tracylau
  • 浏览: 66732 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Class类中的newInstance()

阅读更多
在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?
  用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。
  Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。
  例如:
  Class c = Class.forName(“A”);factory = (AInterface)c.newInstance();
  其中AInterface是A的接口,如果下面这样写,你可能会理解:
  String className = "A";Class c = Class.forName(className);factory = (AInterface)c.newInstance();
  进一步,如果下面写,你可能会理解:
  String className = readfromXMlConfig;//从xml 配置文件中获得字符串Class c = Class.forName(className);factory = (AInterface)c.newInstance();
  上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C , D....等,只要他们继承Ainterface就可以。
   从jvm的角度看,我们使用new的时候,这个要new的类可以没有加载;
  但是使用newInstance时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forName()方法,这个静态方法调用了启动类加载器(就是加载java API的那个加载器)。
  有了上面jvm上的理解,那么我们可以这样说,newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
  这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。

[补充:]
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
分享到:
评论
2 楼 xianbin 2007-01-16  
不好意思,我已经解决了。

原来私有类是不能Loader的。必须把类定义为Public。
1 楼 xianbin 2007-01-16  
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();

请问我的代码在调用newInstance()的时候出错是怎么回事?错误信息:

Class com.test.RemoteLoginContext can not access a member of com.test.SSOValidateModule with modifiers ""

请指教,谢谢!

相关推荐

    new关键字和newInstance() 的区分

    而 newInstance() 方法则是 Class类的一个方法,用于创建一个新的对象。例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用...

    newInstance()方法和new关键字

    - **newInstance()方法**:这是`java.lang.Class`类中的一个方法,用于根据给定的`Class`对象实例化一个新的对象。此方法会调用相应类的无参构造函数来创建实例。 - **new关键字**:这是Java中的一个保留关键字,...

    Class.forName()_newInstance()_New_三者区别

    在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...

    Java中的CLASS类Java中的CLASS类

    Point point = (Point) constructor.newInstance(10, 20); System.out.println("Point created with coordinates (" + point.x + ", " + point.y + ")"); } catch (Exception e) { e.printStackTrace(); } ``` 8...

    class literal & instance.getClass() & Class.forName(String className)

    我们可以使用class literal来获取类的元数据,如类名、接口实现、父类等,也可以用于创建类的新实例(通过`newInstance()`方法,前提是该类有无参构造器)。 接着,我们讨论 "instance.getClass()"。这个方法是每个...

    JavaSE062Class类、Method类及Field类的使用方式深度探析.doc

    JavaSE062Class类、Method类及Field类是Java中三个非常重要的类,它们都是Java反射机制的核心组件。在Java中,反射机制是指可以在运行时检查和修改类、方法、变量等成员的行为。下面我们将深入探析这三个类的使用...

    Java中new关键字和newInstance方法的区别分享

    相比之下,`newInstance()`方法是`java.lang.Class`类的一个方法,它依赖于反射机制来创建对象。反射允许程序在运行时动态地获取类的信息并操作类的对象。使用`newInstance()`的方法流程如下: 1. 类加载与链接:与...

    java.lang.Class类

    2. newInstance():可以为类创建一个实例,这个方法调用默认构造器(无参数构造器)初始化新建对象。 3. getClassLoader():返回该类的类加载器。 4. getComponentType():返回表示数组组件类型的Class。 5. ...

    Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()方法和newInstance()方法是Java语言中两个重要的机制,它们可以实现类的加载和实例化。它们的使用可以提高代码的灵活性和可维护性,但是也需要注意它们的缺点和限制。 知识点: 1. Class.forName()...

    Classfor的用法

    需要注意的是,`newInstance` 方法只能调用无参构造器,如果类中没有默认的无参构造器,那么将抛出 `InstantiationException` 异常。此时可以使用 `Class.getDeclaredConstructor` 和 `Constructor.newInstance` ...

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

    Object obj = clazz.newInstance(); System.out.println(obj.getClass().getName()); // 输出:org.whatisjava.reflect.Foo } catch (ClassNotFoundException | InstantiationException | IllegalAccessException...

    java中的Class类和反射.docx

    - **`public T newInstance()`**:根据`Class`对象所对应的类类型新建一个类实例。此方法常用于反射中创建对象和调用对象的方法。例如: ```java Class doubleClass = Class.forName("java.lang.Double"); Object...

    java_innerclass_instance.rar_innerclass

    在“java_innerclass_instance.rar_innerclass”这个压缩包中,包含的资源可能是一个关于Java内部类实例应用的示例代码。 内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。这里我们主要...

    Java中Class类工作原理详解

    - **创建对象**:`Class`对象提供了`newInstance()`方法,用于创建类的新实例(前提是没有参数的构造函数)。 - **获取类的成员信息**:可以获取类的字段(`getFields()`)、方法(`getMethods()`)和构造器(`...

    认识Java的Class类.doc

    9. **实例化对象**:通过Class对象,可以使用`newInstance()`方法动态创建类的实例,前提是没有默认构造器或者构造器没有参数。 10. **方法的访问**:Class对象提供了`getMethod()`、`getDeclaredMethod()`等方法,...

    jdbc驱动程序实例

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...

    jvm 加载class文件

    这里使用了`Class.forName("TestClass")`方法显式地加载`TestClass`类,并通过`newInstance()`方法创建实例。这种方法比默认加载过程更为灵活,可以在运行时动态地加载类。 ##### 示例3:自定义类加载器加载过程 `...

    Class.forName

    一旦获取到`Class`对象,你可以进一步使用`newInstance()`方法创建该类的实例。`newInstance()`会调用类的无参数构造器来创建对象,类似于`new MyClass()`。但是,如果类没有无参构造器或者构造器是私有的,`new...

    学习Java中Class类及其用法

    - `newInstance()`:调用Class对象的`newInstance()`方法能创建目标类的实例,但前提是类必须有无参构造器,并且可访问。返回的是`Object`类型,需要强制转换。 - **泛型Class引用**:使用泛型Class引用可以创建...

    类 ClassT1

    - `newInstance()`:创建类的新实例,但只适用于有默认构造函数的类。 除了通过 `obj.getClass()` 获取对象的类信息外,我们还可以使用类字面量(如 `Foo.class`)来获取指定类型的 `Class` 对象。类字面量允许我们...

Global site tag (gtag.js) - Google Analytics