黑马程序员_Java高新技术知识要点
---------------------- android培训 、java培训 、期待与您交流! ----------------------
?
?
?
?
?
class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } }
?
?
?
?
代理的概念与作用 :????? Proxy
要为已存在的多个具有相同接口的目标的各个方法增加一些系统功能 , 例如 , 异常处理 , 日志 , 计算方法的运行时间 , 事务管理 , 等等 .
代理类的每个方法调用目标类的相同方法 , 并在调用方法时加上系统功能的代码 .
采用工厂模式和配置文件的方式进行管理 .
面向方面的编译 .AOP(Aspect Oriented Program)
?
Proxy.getProxyClass(ClassLoader,interfaces)
上面的类加载器通常使用和后面接口相同的类加载器 .
Proxy.getProxyClass(collection.class.getClassLoader(), collection.class)
通过上面返回的 Class 文件可以用反射来查到该代理类的构造函数和方法 . 查看后发现该代理类只有一个有参的构造方法 , 参数为 InvocationHandler 对象 .
创建此代理类的实例对象只能用这个有参的构造方法来 newInstance. 这时要用到参数对象 , InvocationHandler 查看后发现是一个接口 , 所以要自己创建一个它的子类对象给构造函数调用 . 发现获得的实例对象的 toString 方法返回的是 null.? 只能调用该对象的无返回值类型的方法 .
InvocationHandler 可以用匿名内部类来实现 , 在这个匿名内部类中也可以定义对象 , 方法 .
?
Collection proxy=(Collection)Proxy.newProxyInstance(
????target.getClass().getClassLoader(),
????target.getClass().getInterfaces(),
????//匿名内部类来实例化InvocationHandler对象.
????new InvocationHandler() {
?????@Override//复写父类的invoke方法.
?????public Object invoke(Object proxy, Method method, Object[] args)
???????throws Throwable {
??????long beginTime=System.currentTimeMillis();
??????Object retVal=method.invoke(target, args);//调用目标的运行方法.
??????long endTime=System.currentTimeMillis();
??????System.out.println(method.getName()+"方法运行时间为"+(endTime-beginTime));
??????return retVal;
?????}
????}
????);
?
?
?
---------------------- android培训 、java培训 、期待与您交流! ----------------------