Java加载class主要分为以下三种类型:
一、Class cls=Class.forName(“包名.类名”)
Object obj=cls.newInstance();创建对象
二、ClassLoader clsLoader=new MyClassLoader()
Class cls=clsLoader.load("包名.类名")
Object obj=cls.newInstance();创建对象
三、ClassLoader clsLoader=new MyClassLoader()
Class cls=clsLoader.findClass(“路径····类名.class")
Object obj=cls.newInstance();创建对象
class Name { 静态变量 static{ 静态域 } 实例变量 { 实例域 } }
静态域和静态变量总是在类加载的时候执行:1、类加载发生在创建类实例前;2调用类静态方法时会加载类。
三种方式有哪些区别呢?
三种方式的共性:所有class只能连接一次。
方式一:装载完class之后,会立即连接class;连接class会执行class的静态变量区域和静态域。Class.newInstace()会创建类的对象,这时会执行实例变量和实例域。
方式二:只是装载class,并不会连接class;只能装载工程内部的class。Class.newInstace()调用后会先连接class,然后创建类的对象,执行实例变量和实例域。
方式三:只是装载class,并不会连接class;这种方式的特点是可以装载工程外部class文件。Class.newInstace()调用后会先连接class,然后创建类的对象,执行实例变量和实例域。
部分代码:ClassLoader
package textarc; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import javax.imageio.stream.FileImageInputStream; public class MyClassLoader extends ClassLoader{ @Override public Class<?> loadClass(String arg0) throws ClassNotFoundException { // TODO Auto-generated method stub return super.loadClass(arg0); } @SuppressWarnings("deprecation") @Override public Class<?> findClass(String arg0) throws ClassNotFoundException { // TODO Auto-generated method stub byte[] b = null; try { b = loadclassData(arg0); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return defineClass("textarc.hh",b, 0, b.length); } public byte[] loadclassData(String path) throws Exception{ int n=0; BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(path)); ByteArrayOutputStream bos=new ByteArrayOutputStream(); while((n=bufferedInputStream.read())!=-1){ bos.write(n); } bufferedInputStream.close(); return bos.toByteArray(); } }
package textarc; import java.io.File; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { try { Class.forName("textarc.hh"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } MyClassLoader classLoader=new MyClassLoader(); try { Class cls= classLoader.loadClass("textarc.hh"); cls.newInstance(); // Class cls= classLoader.findClass("D:\\workspace_new\\textarc\\bin\\textarc\\hh.class"); // cls.newInstance(); } catch (Exception e) { // // TODO Auto-generated catch block e.printStackTrace(); } } }