类加载、内

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 一、类加载器 类加载器用于加载Java的字节代码到Java虚拟机中,同时将配置文件等放在classpath目录下。 类加载器读取Java字节码文件并转换成Java.lang.Class类的一个实例,通过该实例的newInstance()方法可以创建该类对象(相当于调用空参数的构造方法)。基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。 ClassLoader getParent();//返回该类加载器的父类加载器 Class

public class ClassLoaderTree{(String[] args){ClassLoader loader = ClassLoaderTree.class.getClassLoader();While(loader!=null){Sysotem.out.println(loader.getClass().getName());loader = loader,getParent();}}}

类加载器的委托代理机制: 首先当前线程的类加载器去加载线程中的第一个类,如果类A引用了类B,java虚拟机将使用加载类A的类加载器加载类B,还可以直接调用ClassLoader.laod()方法来指定某个类加载器去加载某个类。 每个类加载器加载类时,先委托给其上级父类加载器,当所有祖宗加载器都么有加载到类,则回到发起者类加载器,若发起者类加载器还加载不了,则抛出异常(ClassNotFoundException),而不是再去找发起者类加载器的儿子,因为ClassLoader类中没有getChild()方法。 自定义类加载器: 步骤: 1.编写一个加密程序 2.编写一个类加载器可以对加密过的类进行装载和解密 3.编写一个程序调用类加载器来加载类

{(String[] args) throws Exception {String srcPath = args[0];//源路径String destDir = args[1];//目标的目录FileInputStream fis = new FileInputStream(srcPath);String destFileName = srcPath.substring(srcPath.lastIndexOf(“\\”)+1);String destPath = destDir +”\\”+destFileName;FileOutputStream fos = new FileOutputStream(destPath);//目标路径cypher(fis,fos);fis.close();fos.close();}(InputStream in,OutputStream out) throws Exception{int by = 0;while((by=in.read())!=-1){out.write(by^0xff);}}private String classDir;@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException{//子类不能抛出比父类更广泛的异常String fileName = classDir+”\\”+name.substring(name.lastIndexOf(“.”)+1)+”.class”;try {FileInputStream fis = new FileInputStream(fileName);ByteArrayOutputStream baos = new ByteArrayOutputStream();cypher(fis,baos);fis.close();byte[] bytes = baos.toByteArray();return defineClass(bytes, 0, bytes.length);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return super.findClass(name);}public MyClassLoader(){}public MyClassLoader(String classDir){this.classDir=classDir;}}{@Overridepublic String toString() {return “Hello,ClassLoader!”;}}{(String[] args) throws Exception {Class clazz = new MyClassLoader(“itcastlib”).loadClass(“ClassLoaderAttachment”);Date d1 = (Date)clazz.newInstance();System.out.println(d1);}}

二、内省: 内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。JDK提供了对JavaBean进行操作的API,这套API就称为内省。 Java的内省是指在不知道Bean对象的属性的情况下,通过Introspector和属性描述器(PropertyDescriptor)来获取属性的getter/setter方法。 Java内省机制的一般做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。

public class IntrospectorTest {public static void main(String[] args) throws Exception {Point p = new Point(2,3);String propName=”x”;PropertyDescriptor propDesc = new PropertyDescriptor(propName, Point.class);Method methodGetX = propDesc.getReadMethod();Object obj = methodGetX.invoke(p);System.out.println(obj);PropertyDescriptor proDescriptor = new PropertyDescriptor(propName, Point.class);Method methodSetX = proDescriptor.getWriteMethod();methodSetX.invoke(p, 8); System.out.println(p.getX());}}BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();for(PropertyDescriptor pd : pds){if(pds.getName().equals(propertyName)){Method getX = pd.getPeadMethod();retval = getX}}人若软弱就是自己最大的敌人

类加载、内

相关文章:

你感兴趣的文章:

标签云: