黑马程序员_类加载器、代理、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培训、期待与您交流! ----------------------
类加载器:
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培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员: 基础加强(反射、类加载器、动态代理技术、AOP、InvocationHandler)
- 黑马程序员————java中类的加载、反射、动态代理、枚举
- 黑马程序员——高新技术---类加载器、AOP
- 黑马程序员_基础加强(7) 动态代理与AOP切面
- 黑马程序员-高新技术-动态代理及AOP框架
- 黑马程序员-基础加强04类加载 动态代理
- 《黑马程序员》 动态代理之Aop框架的实现
- 加强2注解。泛型。类加载器及其委托机制。代理的概念与作用原理,AOP概念。实现AOP功能的封装与配置。类似Spring。
- 黑马程序员__类加载器__代理
- 黑马程序员_泛型、类加载器、代理类、AOP
- 黑马程序员-类加载器及动态代理
- 黑马程序员---张老师高新技术之类加载器.代理与AOP
- 黑马程序员_类加载器、代理
- 黑马程序员-Java学习(高新)18-类加载器,代理
- 黑马程序员--09.动态与代理AOP--04【推理动态代理类内部结构I】【InvocationHandler实现类的具体写法】
- 黑马程序员——反射——类的加载,反射的应用,简单动态代理
- 黑马程序员 java高新技术之代理和AOP原理
- 黑马程序员_高新技术:5)类加载器、代理
- 黑马程序员—Java提高3(注解,类加载器,代理)