`
Tracylau
  • 浏览: 64992 次
  • 性别: 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 ""

请指教,谢谢!

相关推荐

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

    Java中 Class.forName()_newInstance()_New_三者区别。

    使用newInstance()来实例化fragment并传递数据操作

    在这种情况下,newInstance()方法是一种“静态工厂方法”,让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。 为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了...

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

    主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    jdbc驱动程序实例

    Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&...

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    java连接数据库字符串

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2数据库 Class....

    Android代码-TypeBuilder

    .newInstance(List.class) .addTypeParam(String.class) .build(); Example for List<? super String> Type type = TypeBuilder .newInstance(List.class) .addTypeParamSuper(String.class) .build(); ...

    Oracle命令大全

    Object userDao = userDaoClass.newInstance(); Class userServiceClass = Class.forName(config .getInitParameter("userService")); Constructor cons1 = userServiceClass.getConstructor(UserDao...

    Android中动态载入自定义类

    普通的Android程序Dalvik虚拟机都是从一个默认的地方载入程序需要的类文件(dex文件),而Dalvik虚拟机还提供了从其他...通过获得到的类的newInstance函数来生成需要的对象 开始使用获取到的动态类对象~\(≧▽≦)/~啦啦啦

    day021-反射和注解笔记和代码.rar

    Class类中方法newInstance():创建当前字节码对象(只能调用无参且是public修饰的构造方法) 2. 根据字节码文件获取构造方法、普通方法、字段等 构造方法 Constructor[] constructors...

    prototype.js 1.4 原代码阅读

    * 要使用 X 类型,需继续用 new X()来获取一个实例,如同 java 的 Class.newInstance()方法。 * * 返回的构造函数会执行名为 initialize 的方法, initialize 是 Ruby 对象的构造器方法名字。 * 此时initialize...

    详解Ruby中的instance_eval方法及其与class_eval的对比

    这个BasicObject#instance_eval有点类似JS中的bind方法,不同的时,bind是将this传入到对象中,而instance_eval则是将代码块(上下文探针Context Probe)传入到指定的对象中,一个是传对象,一个是传执行体。...

    Java 反射(Reflection) 经典实用例子

    public Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = ...

    java反序列化漏洞URLClassLoader利用1

    执行链实际为:URLClassLoader.class.getConstructor(java.net.URL[].class).newInstance(new

    access jar驱动连接数据库

    access jar驱动连接数据库

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    Java 连接多种数据库代码参考

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

    java 反射简单用例

    java反射的用例代码 // //获取类对象的属性 // Field field = clazz.getDeclaredField("name");...// Object instance = constructor.newInstance(new Object[]{1, "李四", "中国"}); // System.out.println(instance);

    java中Class.forName的作用浅谈

    介绍了java中Class.forName的作用,有需要的朋友可以参考一下

    php-cache-class:一个简单的基于文件的缓存,基于Erik Giberti的FileCache类。 该类的新版本包括加密,数据序列化和错误修复

    //create new instance of the class $ cache = new Cache ( "tmp/" ); //... 样品电话 $ cache_key = "client_list" ; //see if we can get an existing cache if (! $ clients_data = $ cache -> get ( $ cache_...

Global site tag (gtag.js) - Google Analytics