黑马程序员_Java基础12
2013-04-02 23:14
239 查看
------- android培训、java培训、期待与您交流!
----------
ClassLoader 类加载器
系统默认的三个主要加载器:
BootStrap:加载JRE/librt.jar
ExtClassLoader:加载JRE/lib/ext/*.jar
AppClassLoader:加载CLASSPATH指定的所有jar或目录
其中BootStrap不是Java类。
所有的类加载器(除了BootStrap)都是个类,也有它的对象和Class文件
System.class.getClassLoader()为null,System的类加载器是BootStrap。
因为BootStrap不是Java虚拟机中的一个类,它是用C++编写的一个类,所以Java虚拟机无法获取它。
如类A引用了类B,Java虚拟机将用类A的加载器去加载类B.
加载器的委托机制:
每个类加载器加载类时,会先委托其父类加载器去加载。
当所有祖宗类的加载器都没有加载到类,则调用发起者的类加载器加载,如果也加载不了,将抛出ClassNotFoundException,即使此加载器有子类,它也不会调用它的子类去加载。
例如:
定义一个MyServlet类继承于HttpServlet,现将MyServlet的class文件打成jar包,放到JDK的JRE/lib/ext/的路径下,则这个jar文件将由ExtClassLoader在JVM启动时进行加载,但加载这个MyServlet的同时,需要先加载他的父类HttpServlet,而这时ExtClassLoader会尝试在JRE/lib/ext/的路径下寻找HttServlet,如果没找到,则直接报错ClassNotFoundException,而不会再调用别的加载器去加载了。
可以指定某个类加载器加载类:
Class ClassLoader.loadClass(String name);
Thread类可启动一个类加载器:
Thread.setContextClassLoader(ClassLoader cl);
自定义类加载器
应用案例:自定义一个类加载器,将此加载器挂在AppClassLoader下,并且让自定义类加载器去加载某个类。
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
无需覆盖loadClass(String name)
只需覆盖findClass(String name)
class MyClassLoader extends ClassLoader {
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.lenght);
public byte[] loadClassData(String name) {
//从指定处载入class字节码数据
...
}
}
应用练习:对class文件进行加密/解密
Proxy类 动态代理技术
此类位于java.lang.reflect包下,此类拥有创建动态代理实例的方法。
构造函数:
Proxy(InvocationHandler h)
常用方法:
Class<?> getProxyClass(ClassLoader loader, class<?> ...interfaces); 根据提供的类加载器和接口数组,返回代理类的Class对象
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); 根据提供的类加载器、接口数组和动态代理调用处理程序,返回一个动态代理实例。其内部调用了getProxyClass()方法,先创建一个动态类的Class,在绑定InvocationHandler调用处理程序,最终创建了一个动态代理对象。
创建动态代理类的实例对象:
1.通过反射获取构造函数
2.编写一个InvocationHandler实现类
InvocationHandler 接口
此接口的实现类对象是个动态代理实例的调用处理程序。
主要方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
当动态代理实例调用某方法时,此调用处理程序将调用某方法的Method对象,再调用invoke方法反射执行某方法,并返回执行结果。
此被调用方法应该是被代理对象的接口中的方法。因为内部是通过那组接口反射出Method对象的。
封装获取代理对象的方法:
public static Object getProxy(final Object obj, final Advice advice)
{
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler()
{
@Override
public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable
{
advice.beforeInvoke(args);
Object retVal = method.invoke(obj, args);
advice.afterInovoke(args);
return retVal;
}
}
);
}
应用扩展:利用动态代理的实现AOP框架
StringBuffered与StringBuilder的区别
StringBuffered是线程安全的,StringBuilder不是线程安全的。
在多线程下使用StringBuffered较好。
但是在单线程下,StrignBuilder的效率更高。
Executors类
此类常用方法:
ExecutorService newCacheThreadPool()
ExecutorService newFixedThreadPool(int size);
ExecutorService newSingleTHread()
定时器:
ScheduledExecutorService newScheduledThreadPool(int size)
ScheduledExecutorService newScheduledThreadExecutor()
ScheduledExecutorService newSingleScheduledThreadExecutor()
创建一个单线程:
ExecutorService pool = Executors.newSinghleThreadExecutor();
pool.execute(Runnable command);
内部类访问外部类的成员变量的格式:外部类名.this.外部成员变量
随机生成1到10秒的时间:Thread.sleep(new Random().nextInt(10)+1 * 1000);
------- android培训、java培训、期待与您交流!
----------
详情请查看:http://edu.csdn.net/heima
----------
ClassLoader 类加载器
系统默认的三个主要加载器:
BootStrap:加载JRE/librt.jar
ExtClassLoader:加载JRE/lib/ext/*.jar
AppClassLoader:加载CLASSPATH指定的所有jar或目录
其中BootStrap不是Java类。
所有的类加载器(除了BootStrap)都是个类,也有它的对象和Class文件
System.class.getClassLoader()为null,System的类加载器是BootStrap。
因为BootStrap不是Java虚拟机中的一个类,它是用C++编写的一个类,所以Java虚拟机无法获取它。
如类A引用了类B,Java虚拟机将用类A的加载器去加载类B.
加载器的委托机制:
每个类加载器加载类时,会先委托其父类加载器去加载。
当所有祖宗类的加载器都没有加载到类,则调用发起者的类加载器加载,如果也加载不了,将抛出ClassNotFoundException,即使此加载器有子类,它也不会调用它的子类去加载。
例如:
定义一个MyServlet类继承于HttpServlet,现将MyServlet的class文件打成jar包,放到JDK的JRE/lib/ext/的路径下,则这个jar文件将由ExtClassLoader在JVM启动时进行加载,但加载这个MyServlet的同时,需要先加载他的父类HttpServlet,而这时ExtClassLoader会尝试在JRE/lib/ext/的路径下寻找HttServlet,如果没找到,则直接报错ClassNotFoundException,而不会再调用别的加载器去加载了。
可以指定某个类加载器加载类:
Class ClassLoader.loadClass(String name);
Thread类可启动一个类加载器:
Thread.setContextClassLoader(ClassLoader cl);
自定义类加载器
应用案例:自定义一个类加载器,将此加载器挂在AppClassLoader下,并且让自定义类加载器去加载某个类。
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
无需覆盖loadClass(String name)
只需覆盖findClass(String name)
class MyClassLoader extends ClassLoader {
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.lenght);
public byte[] loadClassData(String name) {
//从指定处载入class字节码数据
...
}
}
应用练习:对class文件进行加密/解密
Proxy类 动态代理技术
此类位于java.lang.reflect包下,此类拥有创建动态代理实例的方法。
构造函数:
Proxy(InvocationHandler h)
常用方法:
Class<?> getProxyClass(ClassLoader loader, class<?> ...interfaces); 根据提供的类加载器和接口数组,返回代理类的Class对象
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); 根据提供的类加载器、接口数组和动态代理调用处理程序,返回一个动态代理实例。其内部调用了getProxyClass()方法,先创建一个动态类的Class,在绑定InvocationHandler调用处理程序,最终创建了一个动态代理对象。
创建动态代理类的实例对象:
1.通过反射获取构造函数
2.编写一个InvocationHandler实现类
InvocationHandler 接口
此接口的实现类对象是个动态代理实例的调用处理程序。
主要方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
当动态代理实例调用某方法时,此调用处理程序将调用某方法的Method对象,再调用invoke方法反射执行某方法,并返回执行结果。
此被调用方法应该是被代理对象的接口中的方法。因为内部是通过那组接口反射出Method对象的。
封装获取代理对象的方法:
public static Object getProxy(final Object obj, final Advice advice)
{
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler()
{
@Override
public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable
{
advice.beforeInvoke(args);
Object retVal = method.invoke(obj, args);
advice.afterInovoke(args);
return retVal;
}
}
);
}
应用扩展:利用动态代理的实现AOP框架
StringBuffered与StringBuilder的区别
StringBuffered是线程安全的,StringBuilder不是线程安全的。
在多线程下使用StringBuffered较好。
但是在单线程下,StrignBuilder的效率更高。
Executors类
此类常用方法:
ExecutorService newCacheThreadPool()
ExecutorService newFixedThreadPool(int size);
ExecutorService newSingleTHread()
定时器:
ScheduledExecutorService newScheduledThreadPool(int size)
ScheduledExecutorService newScheduledThreadExecutor()
ScheduledExecutorService newSingleScheduledThreadExecutor()
创建一个单线程:
ExecutorService pool = Executors.newSinghleThreadExecutor();
pool.execute(Runnable command);
内部类访问外部类的成员变量的格式:外部类名.this.外部成员变量
随机生成1到10秒的时间:Thread.sleep(new Random().nextInt(10)+1 * 1000);
------- android培训、java培训、期待与您交流!
----------
详情请查看:http://edu.csdn.net/heima
相关文章推荐
- 黑马程序员_Java基础[12]_继承
- 黑马程序员_java基础(12)网络编程之UDP
- 黑马程序员---java基础之day12-13
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- 黑马程序员_java编程基础12 IO流
- 黑马程序员__12JAVA基础 字符串缓冲区
- 黑马程序员-Java基础总结12——GUI编程
- 黑马程序员_java基础笔记(12)...内省(IntroSpector)
- 黑马程序员_java基础day12
- 黑马程序员_java基础加强12_空中网题解_老师解答
- 黑马程序员—12.、JAVA基础&高新技术
- 黑马程序员_java基础笔记(12)...内省(IntroSpector)
- 黑马程序员_Java基础_多线程_12
- 【黑马程序员】Java基础12:UDP和TCP的网络通讯
- 黑马程序员 12 Java基础教学 - 12 - Java字符串总结
- 黑马程序员—12—java基础:有关字符串的学习笔记和学习心得体会
- 黑马程序员__JAVA基础__面向对象(一)
- 黑马程序员——Java基础->IO流(上)
- 黑马程序员—Java基础—网络编程
- 黑马程序员——1,JAVA基础:认识JAVA