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

黑马程序员---JAVA基础加强(十八)

2013-12-30 15:12 357 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
 

 

二、JDK1.5新特性
1、Method类

Method类代表某个类中的一个成员方法。调用某个对象身上的方法,要先得到方法,再针对某个对象调用。
1)调用者:是门调用关的动作,对象是门,因为门知道如何执行关的动作,通过门轴之类的细节实现。

2)指挥者:是人在指挥门做关的动作,只是给门发出了关的信号,让门执行。

3)总结:变量使用方法,是方法本身知道如何实现执行的过程,也就是“方法对象”调用方法,才执行了方法的每个细节的。

在这儿提到了专家模式:谁调用这个数据就是谁在调用他的专家。

2、数组反射

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象(此处比较与值无关)。

代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
Arrays.asList()方法处理int[]和String[]时的差异。
Array工具类用于完成对数组的反射操作。

3、类加载器

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。

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

BootStrap:用本地代码实现的(C++的一段二进制代码),它负责加载核心JavaClass(即所有java.*开头的类);

ExtClassLoader:负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类);

AppClassLoader:负责加载应用程序自身的类。

  《注》:ExtClassLoader与AppClassLoader它们都是用Java语言编写的,由Bootstrap加载的。

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

4、类加载器的委托机制

每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。类装载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器去进行真正的加载。当回退到最初的类装载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException异常。

5、自定义类加载器

(1)自定义的类加载器的必须继承ClassLoader的loadClass方法、findClass方法以及defineClass方法。

(2)编写步骤:

编写一个对文件内容进行简单加密的程序。

        编写了一个自己的类装载器,可实现对加密过的类进行装载和解密。

        编写一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类。程序中可以除了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forName。

6、代理的概念与作用

代理就是对一个类进行的代理,或是托管。简单的讲就是对原有类加了一个壳,当程序执行的时候不执行原来的类,首先执行代理类,代理类,可以决定是否执行真正要调用的类。

(1)用途,最常见的就是数据库连接池,数据库连接池里的连接是不能被关闭的。

(2)代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:

1)在调用目标方法之前。 2)在调用目标方法之后。 3)在调用目标方法前后。 4)在处理目标方法异常的catch块中。
例如:利用InvocationHandler接口创建代理类代码示例:
 
 
 
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);//创建代理类
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);//获取代理类的构造方法

class MyInvocationHandler1 implements InvocationHandler//内部类,实现InvocationHandler接口
{
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
}

//代理类通过反射调用方法,参数为内部类的实例对象
Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHandler1());
System.out.println(proxy1.toString());

//运用匿名内部类
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler()
{
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});

//用Proxy的静态方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

Collection proxy3=(Collection)Proxy.newProxyInstance(

Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
ArrayList target= new ArrayList();
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
long startTime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName()+"  running time:"+(endTime - startTime));
return retVal;
}

});
动态代理类框架:

//事务接口
public interface Advice {
void beforeMethod(Method method);//方法执行之前执行的方法
void afterMethod(Method method);//方法执行之后执行的方法
}

//实现事务接口
public class MyAdvice implements Advice {
long startTime=0;
@Override
public void beforeMethod(Method method) { //覆盖父类方法
startTime = System.currentTimeMillis();
}

@Override
public void afterMethod(Method method) {    //覆盖父类方法
long endTime = System.currentTimeMillis();
System.out.println(method.getName()+"  running time:"+(endTime - startTime));
}
}

//创建代理框架
public static Object getProxy(final Object target,final Advice advice) {//传入目标类与事务类
Object proxy3 =Proxy.newProxyInstance(
target.getClass().getClassLoader(),  //类加载器
target.getClass().getInterfaces(),//实现的接口
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice.beforeMethod(method);//执行事务类方法
Object retVal = method.invoke(target, args);//执行目标类的方法
advice.afterMethod(method);//执行事务类方法
return retVal;
}
});
return proxy3;
}


 
 
<----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: