Java 加载class和创建对象的三种形式

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();
	}

}
}



猜你喜欢

转载自blog.csdn.net/jiabailong/article/details/52923728