您的位置:首页 > 其它

反射获取对象属性

2016-01-09 14:21 489 查看
import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.lang.reflect.Field;

public class MyClassLoader extends ClassLoader {

private String name ;//类加载器名字

private String path="d:\\";//加载类的路径

public String getPath() {

return path;

}

public void setPath(String path) {

this.path = path;

}

private final String fileType=".class";//class文件的扩展名

public MyClassLoader(String name){

super();//让系统类加载器成为该类加载器的父加载器

this.name=name;

}

public MyClassLoader(ClassLoader parent ,String name){

super(parent);//显示的指定该类加载器的父加载器

this.name=name;

}

@Override

public String toString() {

return "MyClassLoader [name=" + name + "]";

}

@Override

protected Class<?> findClass(String name) throws ClassNotFoundException {

byte[] data=this.loadClassData(name);

return this.defineClass(name, data, 0,data.length);

}

//通过类的名字从硬盘上找到相应文件,得到class的二进制的数组

private byte[] loadClassData(String name){

//传进name是带.的形式com.ygl-->要转换为com\ygl

InputStream in=null;

byte[] data=null;

ByteArrayOutputStream byteArrayOutputStream=null;

try {

this.name=this.name.replace(".", "\\");

in=new FileInputStream(new File(path+name+fileType));

byteArrayOutputStream=new ByteArrayOutputStream();

int ch=0;

while((ch=in.read())!=-1){

byteArrayOutputStream.write(ch);

}

data=byteArrayOutputStream.toByteArray();

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

in.close();

byteArrayOutputStream.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

return data;

}

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

MyClassLoader loader1=new MyClassLoader("loader1");//父类加载器是系统类加载器

loader1.setPath("d:\\myapp\\serverlib\\");

MyClassLoader loader2=new MyClassLoader(loader1,"loader2");//父类加载器是loader1

loader2.setPath("d:\\myapp\\clientlib\\");

/* MyClassLoader loader3=new MyClassLoader(null,"loader3");//父类加载器是根类加载器

loader3.setPath("d:\\myapp\\otherlib\\");

test(loader2); //loader2有父类加载器loader1,而loader1的父类是系统类加载器,拓展类加载器以及根类加载器是不加载自定义的class的,

//但系统类加载器是在当前目录(.)下查找,也即 在D:\myapp\syslib下查找,并没有Simple.class,从而只有loader1在"d:\\myapp\\serverlib\\"下查找

test(loader3);*/

/*

Class clazz=loader1.loadClass("Simple");

Object object=clazz.newInstance();

Simple simple=(Simple)object;

System.out.println(simple.v1);*/

Class clazz=loader1.loadClass("Simple");

Object object=clazz.newInstance();

try {

Field field=clazz.getField("v1");//获得属性

int v1=field.getInt(object);//获得值

System.out.println(v1);

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchFieldException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}//

}

public static void test(ClassLoader loader) throws ClassNotFoundException, InstantiationException, IllegalAccessException{

Class clazz=loader.loadClass("Simple");//loadClass会调用findClass

Object object= clazz.newInstance();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: