现在的位置: 首页 > 综合 > 正文

黑马程序员-javabean、ClassLoader等

2013年04月30日 ⁄ 综合 ⁄ 共 3432字 ⁄ 字号 评论关闭

---------------------- android培训java培训、期待与您交流! ----------------------

框架的概念及用反射技术开发框架的原理

       框架与工具类的区别:框架调用用户提供的类,而工具类被用户的类调用。

       原理:将要用到的类通过配置文件配置,然后通过Properties类读取到类名,再使用反射创建该类的实例。

用类加载器的方式管理配置文件和资源:

      用已加载进内存的类:

       1、InputStream is =.class.getClassLoader().getRecourceAsStream(“包完整路径.资源文件名”);

       2、InputStream is =.class.getRecourceAsStream(“资源文件名(类和资源文件在同一个文件夹)或者包完整路径.资源文件名”);

由内省(introSpector)引出的JavaBean的讲解:

      
introSpector
àJavaBeanà特殊的java

       JavaBean中的属性并不是其中定义的变量。而是getXxx()setXxx(参数)方法名去掉getset后的单词,当这个单词的第二个字母为小写时,将Xxx的第一个字母小写,如果为大写时,将Xxx的第一个字母保持不变,就是JavaBean的属性。

操作JavaBean的类都在java.beans包下。

       1.对JavaBean的简单的内省操作(通过反射,获得getset方法,对javaBean属性操作)

通过java.beans.PropertyDescriptor类和Method类实现:

       1)    PropertyDescriptor pro = newPropertyDescriptor(“JavaBean属性名”,JavaBean.class);

       2)   
获得JavaBean的属性pro的方法:Method me= pro.getWriteMethod();

       3)   
调用该方法:me.invoke();

      2.对JavaBean的复杂内省操作:

通过java.beans包下的IntroSpector类、BeanInfo接口和PropertyDescriptor类实现:

       1)    BeanInfo bi =IntroSpector.getBeanInfo(javabean.class);IntroSpector的静态方法。

       2)    PropertyDescriptor[] prod =bi.getPropertyDescriptors();获得所有的javabean属性

       3)   
遍历prod查询属性,后面的操作同简单内省操作的第二步起。

    3.使用BeanUtils工具包(阿帕奇公司提供)及第三方jarLoging日志包操作JavaBean

       1)     为了让工程导出后任然可以使用jar包。将jar包配置在工程目录下,在工程下建立lib文件夹,将jar包放入,然后选中jar包右键将它添加到BuildPath中。

       2)     直接调用BeanUtils中的静态方法操作JavaBean

       3)     BeanUtilsProperties之间的转换

       4)     BeanUtils PropertyUtils之间的区别

类加载器:将.calss文件加入内存的工具。 

       Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:

       BootStrapExtClassLoaderAppClassLoader

       类加载器本身也是java类,因为其他是java类的类加载器本身也要被类加载加载进内存,显然有一个类加载器不是java类,这正是BootStrap

       Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级装载器对象或者采用系统类装载器为其父类装加载器。

        1Java虚拟机如何派类加载器加载类:

       (1)  
首先当前线程的类加载器去加载线程中的第一个类。

       (2)  
如果类A引用了类Bjava虚拟机将会使用加载类A的类加载器去加载类B。如果类B没有在加载类A的加载器或其父类加载器对应的目录,虚拟机将会抛出ClassNotFound异常。(注意)

       (3)  
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

       2.每个类加载器怎么加载类:

      先委托给其上级类加载器,当所有的祖宗类加载都没有加载到类,回答发起者类加载器还加载不了,则抛出ClassNotFoundException,不是再去找发起者加载类的儿子。因为没有获得儿子的方法。

自定义类加载器原理:

       1. 自定义的类加载器必须继承ClassLoader

       2. loadClass方法(类加载机制,不需要从写)和findClass方法(自己找,从写)

       3. 调用defineClass方法,获得一个Class类的实例对象

列:编写一个类加载器,加载自己编写的类。

注意:

      当用户建的类导出在系统ClassLoader(BootStrapExtClassLoader)的指定目录下后,运行该类时就会由对应目录的类加载器加载,当把该类的.jar文件删除时,再调用该类时会出错。即使首先用于加载该类的加载器对应的目录中有该类,也会报错。因为jdk已经记住了对应的目录下有该类。此时要重启eclipse

类加载器的一个高级实验问题:Web应用中加载Serverlet类的加载过程。

练习:

 package org.cc.reflect;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
//自定义ClassLoader加载指定路径的类
public class MyClassLoader extends ClassLoader {
 private String path;//自定义ClassLoader的classpath

 public MyClassLoader() {
 }

 public MyClassLoader(String path) {
  this.path = path;
 }

 @Override
 protected Class<?> findClass(String name) throws ClassNotFoundException {
  String filePath = path + "\\" + name + ".class";//要执行的.class文件
  ByteArrayOutputStream bos = null;
  try {
   FileInputStream fis = new FileInputStream(filePath);
   System.out.println(filePath);
   bos = new ByteArrayOutputStream();
   byte[] b = new byte[1024];
   int len = -1;
   while ((len = fis.read(b)) != -1) {
    bos.write(b, 0, len);//将.class文件写入内存
   }
   fis.close();
   byte[] by = bos.toByteArray();
   Class clazz = defineClass(null, by, 0, by.length);//根据bos流中的字节数组创建Class对象
   return clazz;
  } catch (Exception e) {
   e.printStackTrace();
  }

  return super.findClass(name);
 }
}
---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

抱歉!评论已关闭.