`
aaron_ch
  • 浏览: 177379 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Action of classLoad and Class.forName in 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: 弱类型。低效率。只能调用无参构造。 
new: 强类型。相对高效。能调用任何public构造。

 

package com.aaron.ejb.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.aaron.model.Contact;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  EntityManagerFactory emfMySQL = Persistence.createEntityManagerFactory("sample");
        EntityManager emMySQL = emfMySQL.createEntityManager();
  Contact c;

        c = new Contact();
        c.setContactId(4);
        c.setFirstName("Chen");
        c.setLastName("Ping");
        c.setEmail("xjfaaron@yahoo.com");
        TestContact tc=null;
       
         try {
   tc=(TestContact)Class.forName("com.aaron.ejb.test.TestContact").newInstance();
   tc.setManager(emMySQL);
   tc.persist(c);
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

}

分享到:
评论

相关推荐

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    classLoad.rar

    在java中 当你用一个类加载器 去加载一个类的时候 这个类里面所有的出现的过得类 都会通过这个类加载器加载在这个类后续 的操作中,只要是有由这个类衍生出的 那么涉及的类 都由这个类加载器进行加载 该类加载器为...

    java classload教程

    在Java运行时环境中,每个类都是`java.lang.Class`的一个对象实例,通过`Myclass.class`这种方式可以访问到对应的类对象。 类加载器(ClassLoader)在Java中扮演着关键角色。JVM使用类加载器来读取字节码并将其转换...

    Java类热替换(热部署)源码

    2. **JVM工具JIT编译器**:Java虚拟机(JVM)的Just-In-Time(JIT)编译器可以在运行时编译Java字节码为本地机器代码。如果类被修改,JIT可以重新编译新的字节码,实现热替换。 3. **Java代理(Java Agents)**:...

    JAVA内存结构-GC-CLASSLOAD

    【JAVA内存结构】 Java内存结构主要分为五个主要区域:堆(JAVA HEAP)、虚拟机栈(JAVA VIRTUAL MACHINE STACKS)、本地方法栈(NATIVE METHOD STACK)、方法区(METHOD AREA)和程序计数器(RUNTIME CONSTANT ...

    Java反序列化回显解决方案.docx

    private static String testClassName = "summer.classload.Summer"; // Summer.class 类字节码 private static byte[] testClassBytes = new byte[]{ /* ... */ }; public Class<?> defineClassFromBytes...

    值得收藏的2017年Java开发岗位面试题

    Class.forName和classloader都是用于加载类的,但Class.forName只能加载已经加载的类,而classloader可以加载新的类。 7. Java7、Java8的新特性。 Java7和Java8都引入了许多新特性,例如Java7的try-with-resources...

    类加载器,classload

    关于类加载器的 上课ppt -java虚拟机自带的加载器 根类加载器(Bootstrap) c++写的看不到扩展类加载器(extension) 系统类加载器(System) AppClassLoad 用户自定义的类加载器 Java.lang.ClassLoader的子类

    如何正确的使用Java序列化技术

    ### 如何正确使用Java序列化技术 #### 技术研究系列 **摘要:** 本文将深入探讨Java序列化技术的各个方面,从基础知识入手,逐步展开对序列化技术机制与原理的介绍。此外,还将深入讨论如何精准控制序列化机制,...

    深入探讨 Java 类加载器.pdf

    类加载器(Class Loader)是Java语言的关键组成部分之一,它负责将Java类的字节码加载到Java虚拟机(JVM)中,从而使得Java应用程序能够运行起来。自Java诞生以来,类加载器的概念就一直存在,并随着Java技术的发展...

    java面试难点讲解:hashmap,spring aop,classload,dubbo,zookeeper,session等。

    面试必考之HashMap源码分析与实现 探索JVM底层奥秘ClassLoader源码分析与案例讲解 面试必备技能之Dubbo企业实战 ...互联网系统垂直架构之Session解决方案 分库分表之后分布式下如何保证ID全局唯一性 ...

    JavaSE:JavaSE演示

    JavaSE ...│ ├─classLoad │ │ ├─ClassCypher.java │ │ ├─ClassLoadDemo.java │ │ ├─EncryptedCalss.java │ │ └─MyClassLoad.java │ └─designPattern │ ├─decorator <d

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    Java虚拟机类加载机制?案例分析

    在《Java虚拟机类加载机制》一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的后留了一个悬念给各位,这里来揭开这个悬念。建议先看完《Java虚拟机类加载机制》这篇再来看这个,印象会比较深刻...

    用JVM工具接口创建调试和分析代理.docx

    Java虚拟机工具接口(JVMTI,Java Virtual Machine Tool Interface)是Java开发工具包(Java SDK)的一个核心组件,自Java 2 SDK Standard Edition 1.5.0版本起引入,用于替代实验性的JVMPI(Java Virtual Machine ...

    Android插件框架Android-Plugin-Framework.zip

    App安装时,系统会扫描app的Manifest并缓存到一个xml中,activity启动时,系统会现在查找缓存的xml,如果查到了,再通过classLoad去load这个class,并构造一个activity实例。那么我们只需要将classload加载这个class...

    jboss 5 原理 2 classloader

    JBoss 5是一款知名的Java应用服务器,其在类加载(Class Loading)方面有着独特的处理方式。随着OSGi(Open Services Gateway Initiative)风格的类加载机制逐渐流行,以及新的Java模块和类加载规范的出现,JBoss对...

    maven-classloader-plugin:只是针对Maven插件中的类加载问题的实验

    在Java开发领域,Maven作为一款强大的项目管理和构建工具,扮演着举足轻重的角色。然而,随着项目的复杂度增加,类加载问题时常困扰着开发者。本文将深入探讨"Maven-classloader-plugin",一个专为解决Maven插件中的...

Global site tag (gtag.js) - Google Analytics