您的位置:首页 > 职场人生

黑马程序员_类加载器、代理、AOP

2011-09-22 23:01 274 查看
---------------------- android培训、java培训、期待与您交流! ----------------------

类加载器:

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

类加载器也是Java类,所以本身也要被加载,有一个类加载器不是Java类,是c++编写的,就是BootStrap;

说明三个类加载器的父子关系的程序:

class ClassLoaderTest

{

public static void main(String[] args)

{

ClassLoader cl=ClassLoaderTest.class.getClassLoader();

while(cl!=null)

{

System.out.println(cl);

cl=cl.getParent();

}

System.out.println(cl);

}

}

输出结果是:

sun.misc.Launcher$AppClassLoader@1016632

sun.misc.Launcher$ExtClassLoader@dc6a77

null

其中null就代表BootStrap,以为它不是Java类,所以就不能被打印出来;

类加载器的委托机制:

BootStrap->JRE/lib/rt.jar

ExtClassLoader->JRE/lib/ext/*.jar

AppClassLoader->CLASSPATH指定的所有jar或目录;

自己的类加载器都必须要继承ClassLoader;

jvm首先用当前线程的类加载器去加载类;如果类A引用了类B,将使用A的加载器去加载B;

用异或的方法来加密解密;

import java.io.*;

public class MyClassLoader

{

public static void main(String[] args) throws Exception

{

String srcPath=args[0];

String destPath=args[1];

FileInputStream fis =new FileInputStream(srcPath);

FileOutputStream fos =new FileOutputStream(destPath);

cypher(fis,fos);

fis.close();

fos.close();

}

private static void cypher(InputStream ips,OutputStream ops) throws Exception

{

int b=-1;

while(b=ips.read()!-1)

ops.write(b^0xff);

}

}

一个类加载器的高级问题分析:(在tomcat中的web项目)

这个web项目要放在tomcat这样的服务器上,tomcat也是个java类,提供了很多自己的类加载器,主要涉及到servlet,也是tomcat自己的类加载器加载的。

分析代理类的作用和原理及AOP概念

AOP(面向方面的编程)Aspect oriented program;

系统中存在交叉业务,一个交叉业务就是要切入系统中的一个方面;

安全 事务 日志

student--------|-------|---------|------

course --------|-------|---------|------

misc --------|-------|---------|------

用具体的程序代码描述交叉业务:

method1 method2
method3

{ { {

-------------------------切面

... ...
...

-------------------------切面

} } }

面向方面的编程就是要把交叉业务模块化;可以采用将切面代码移动到原始方法的周围,使其对用户看来效果是一样的;

-------------------------切面

{ { {

... ...
...

} } }

-------------------------切面

使用代理技术就可以解决这种问题;

JVM可以在运行期动态生成类的字节码,这种动态类通常被用作代理类,即动态代理类;

JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理;

CGLIB库(非JVM标准库)可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以要为一个没有实现接口的类生成当太代理类,那么可以使用CGLIB库。

一般以clazz打头的都是字节码;

StringBuilder是在单线程中运行的,不考虑线程的安全性,所以比StringBuffer效率高;

建造一个代理类,并且用反射的方式打印出它所有的构造器和方法;

打印对象时如果是null,可能是对象没创建成功,也可能是toString方法返回了null;如果没有报告空指针异常,那么就应该是toString();

在创建匿名子类的时候把括号都先打好,然后再砸开写代码,就不容易错;

每次执行add方法,都执行一次handler方法,所以相当于每次都重新来了个新的;

接受一个handler对象,就是为了记住它,回头使用;

Client(客户端)程序调用objProxy.add("abc")方法时,涉及三要素:objProxy对象,add方法,"abc"参数;对应handler.invoke里面的三个参数;

从object继承的方法只有equals,hashcode,toString三个调用invocationhandler,其他都代理类自己实现;

类似Spring的AOP框架:

有一个BeanFactory.getBean("xxx");xxx代表javabean的名字的字符串;而这个字符串就是在一个配置文件中配置的,相当于告诉Spring,你给我创建一个xxx的实例对象;BeanFactory有两种可能,如果xxx是普通类,比如java.util.ArrayList,则直接创建其实例,如果发现是特殊类,那么就创建其代理类;(这就好比去叫人一样,如果是个普通人直接叫来,如果是领导,就叫秘书),代理类要说明target和advice;ProxyFactoryBean是专门做代理类的JavaBean;用#就可以把config的配置注释掉;

---------------------- android培训、java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: