javaEE-类绑定与类加载
来源:互联网 发布:html调用js函数 编辑:程序博客网 时间:2024/06/15 04:42
1、类绑定– 两种绑定方式
静态绑定 - 编译级别已经绑定
动态绑定 – 运行时才会绑定
public class BoundDemo {public static void main(String[] args) {A a = new B();System.err.println(a.age);//100System.err.println(a.num);//100a.abc();//abc...1000 所有非静态分开方法都是在运行时绑定,动态绑定,其他的都是静态绑定//静态绑定是指在编译时已经指定引用的就是静态绑定a.aaa();//aaa..100}}class A{public int age=100;public static int num = 100;public void abc(){System.err.println("abc....100");}public static void aaa(){System.err.println("aaa....100");}}class B extends A{public int age=1000;public static int num = 1000;public void abc(){System.err.println("abc....1000");}public static void aaa(){System.err.println("aaa....1000");}}
3、 类加载
所有类加载器,都是ClassLoader的子类。
类加载器永远以.class运行的目录为准。
读取classpath根目录下的文件有以下几种方式:
在Java项目中可以通过以下方式获取classspath下的文件:
public void abc(){//每一种读取方法,使用某个类获取AppclassloaderClassLoader cl = ReadFile.class.getClassLoader();URL url = cl.getResource("a.txt");System.err.println("url1 is:"+url.getPath());//第二种方式,直接使用ClassLoaderURL url2 = ClassLoader.getSystemResource("a.txt");System.err.println("url2 is:"+url2.getPath());}
/** * 一个类的加载分两种情况 * * 第一种是java项目 * 在java项目中由于没有容器,只有JVM,所以只有三个类加载器(...) * 所以在java项目中所有用户类都是被AppClassLoader(用java写的)加载的。 * 而所有如String这样的系统类,都是被BootStrap(用C语言写)加载的。 * * 第二种是web项目 * 如果一个类运行在容器如tomat中,由于tomcat已经扩展了类加载器 * WebAppClassLoader,StandardClassLoader * 所以所有的运行在tomcat中的类都是被Stan..加载的。 * * 所有的系统类如java.lang.String,ClassLoader不管是运行在java项目中 * 还是运行在tomcat中都永远是被BootStrap加载的。 * */
在Tomcat中tomcat又声明了两个类载器:
StandardClassLoader–加载tomcat/lib/*.jar - serlvetapi.jar
Webappclassloader/加载 tomcat/webapps/project/web-inf/lib/*.jar && web-inf/classes/*.class
在任何的项目中,获取类的加载器都应该使用以下方式:
SomeClass(你写的).class.getClassLoader().getResource;获取到这个类的类加载器
在java项目中是:AppClassLoader
在Web项目中:WebAppClassLoader
public class OneServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {ClassLoader loader = OneServlet.class.getClassLoader();//WebAppClassLoaderint index=1;while(loader!=null){System.err.println((index++)+"类加载器是:"+loader.getClass()); loader=loader.getParent();//获取父类加载器}}}
运行的结果:
1类加载器是:classorg.apache.catalina.loader.WebappClassLoader
2类加载器是:classorg.apache.catalina.loader.StandardClassLoader
3类加载器是:class sun.misc.Launcher$AppClassLoader
4类加载器是:class sun.misc.Launcher$ExtClassLoader
4、 自定义类加载器
JDK以哪一个类加载器读取A类的字节码,则A类就是被哪一个类加载器加载 的。
一个同名的类,是否可以相互转换,要看是否是在同个类加载器中
public class MyClassLoader2 extends ClassLoader {/** * name:cn.itcast.demo.Person * 根据包名找到.class文件 * cn.itcast.demo.person = > cn/itcast/demo/Person.class */public Class<?> findClass(String name) throws ClassNotFoundException {String classNameWithPackage=name;Class<?> cls = null;try {//先将name = name.replace(".","/");name +=".class";//确定目录URL url = MyClassLoader2.class.getClassLoader().getResource(name);System.err.println(">>:"+url.getPath());File file = new File(url.getPath());InputStream in = new FileInputStream(file);//读取这个.class文件的字节码byte[] b = new byte[in.available()];//直接声明这个字节大小为这个文件的大小int len = in.read(b);//len=621System.err.println(len);/** * 第一个参数是类名 */cls = defineClass(classNameWithPackage,b,0,len);} catch (Exception e) {e.printStackTrace();}return cls;}}
测试类自定义类加载器“
public class ClassLoaderDemo {public static void main(String[] args) throws Exception {MyClassLoader2 mc = new MyClassLoader2();Class cls = mc.findClass("cn.itcast.demo.Person");Object o = cls.newInstance();System.err.println("toString:"+o+","+o.getClass().getClassLoader());//直接使用peron是 AppClassLoaderSystem.err.println(">>:"+Person.class.getClassLoader());//由于o是由mc加载的。而Person是由App加载的,所有不可以转换=来自于两个不同的加载器//Person p = (Person) o;//类型转换错误ClassCastException//System.err.println(p);}}
- javaEE-类绑定与类加载
- Java和JavaEE类加载机制
- JavaEE ear包类加载器机制解析
- 主题:JavaEE ear包类加载器机制解析
- Java和JavaEE类加载机制简单介绍(转载)
- JavaEE笔记(一)类加载器(ClassLoader)
- JavaEE中标签接口与类体系
- javaee sqlhelper公共类的定义与使用
- SimpleCursorAdapter类与数据绑定
- SimpleCursorAdapter类与数据绑定
- SimpleCursorAdapter类与数据绑定
- SimpleCursorAdapter类与数据绑定
- 动态加载程序集与晚期绑定
- 数据绑定(java类与ActionScript类绑定)
- python类的绑定方法与非绑定方法
- 类加载与反射
- (转帖)类如何与界面绑定
- iOS开发ViewController与Swift类绑定
- 产品经理的自我修养:方法论
- Matlab虚拟现实工具箱——快速配置
- Lua 笔记 1-1 基本函数使用
- mssql查看数据库中所有触发器语句
- oracle实例恢复 详解理论知识
- javaEE-类绑定与类加载
- CSS Sprites的一些技巧
- c++构造函数再调用构造函数
- CSS雪碧:要还是不要?
- 工程文件存储策略,实现前后兼容打开。
- Word2vec在事件挖掘中的调研
- 设计模式C++实现(4)——单例模式
- s3c2440_Nand Flash Controller
- 二级指针详解