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调用类静态方法时会初始化类。

例如创建实例变量,调用静态函数,或者静态变量,都会初始化静态域和静态变量;但像Object obj;这样的声明就不会执行

 

 

 

三种方式有哪些区别呢?

  三种方式的共性:所有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();
	}

}
}

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值