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