- 浏览: 136046 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
jptiancai:
提供下第六种做法,多用些内存,遍历set的时候,用list删除 ...
解决ArrayList的ConcurrentModificationException -
langmanjian0212:
spring 2.5
spring中文文档下载 -
hoarhoar:
我已经更新了,现在是完整版了。请到csdn上下载,或者向我要。 ...
java编程思想第四版勘误下载 -
zzplovejava:
好,英文差有中文的先学学
spring中文文档下载 -
呆哥儿:
Service 确实 不过为什么没有得到广泛应用呢 !求教
使用泛型类简化服务层(Service)类的设计
1 java反射机制:运行时的类信息
Class类与java.lang.reflect类库一起对反射概念进行了支持,该类库包含了Field,Method以及Constructor类。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。这样就可以使用Constructor创建新的对象,用get()与set()方法读取与修改与Field对象相关的字段,用invoke()方法调用与Method对象相关的方法等等。
2 动态代理:
代理模式:为了提供额外的或不同的操作,而插入的用来代替“实际”对象。这些操作通常涉及与“实际”对象的通讯,因此代理通常充当着中间人的角色。
动态代理:所有的调用都会被重定向到单一的调用处理器上,他的工作是揭示调用的类型并确定相应的对策。
java反射机制实现动态代理的源码:
interface Interface { void doSomething(); void somethingElse(String arg); } class RealObject implements Interface { public void doSomething() { print("doSomething"); } public void somethingElse(String arg) { print("somethingElse " + arg); } }
import java.lang.reflect.*; class DynamicProxyHandler implements InvocationHandler { private Object proxied; public DynamicProxyHandler(Object proxied) { this.proxied = proxied; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("**** proxy: " + proxy.getClass() + ", method: " + method + ", args: " + args); if (args != null) for (Object arg : args) System.out.println(" " + arg); return method.invoke(proxied, args); } } public class SimpleDynamicProxy { public static void consumer(Interface iface) { iface.doSomething(); iface.somethingElse("bonobo"); } public static void main(String[] args) { RealObject real = new RealObject(); consumer(real); // Insert a proxy and call again: Interface proxy = (Interface) Proxy.newProxyInstance(Interface.class .getClassLoader(), new Class[] { Interface.class }, new DynamicProxyHandler(real)); consumer(proxy); } }
当我们查看java.lang.reflect.Proxy源码,我们发现起核心作用的是ProxyGenerator.generateProxyClass(String paramString, Class[] paramArrayOfClass),最令人疑惑的问题是,代理对象和如何调用DynamicProxyHandler的invoke方法的,从源码里面我们很难发现如何处理的,对于ProxyGenerator写了一个测试类ProxyClassFile
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import sun.misc.ProxyGenerator; public class ProxyClassFile { public static void main(String[] args) { String proxyName = "SimpleDynamicProxy"; RealObject t = new RealObject(); Class[] interfaces = t.getClass().getInterfaces(); byte[] proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces); File f = new File("E:/workspace/TIJ4/bin/typeinfo/SimpleDynamicProxy.class"); try { FileOutputStream fos = new FileOutputStream(f); fos.write(proxyClassFile); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); // To change body of catch statement use File | // Settings | File Templates. } catch (IOException e) { e.printStackTrace(); // To change body of catch statement use File | // Settings | File Templates. } } }
反编译SimpleDynamicProxy.class,代码初看起来有点复杂,仔细观察还是很有规律的,将SimpleDynamicProxy5个方法都重定向到invoke()方法,equals(),hashCode()和toString()都是父类Object方法,doSomething()和somethingElse()为接口方法。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import typeinfo.Interface; public final class SimpleDynamicProxy extends Proxy implements Interface { private static Method m1; private static Method m0; private static Method m3; private static Method m4; private static Method m2; public SimpleDynamicProxy(InvocationHandler paramInvocationHandler) throws { super(paramInvocationHandler); } public final boolean equals(Object paramObject) throws { try { return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue(); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final int hashCode() throws { try { return ((Integer)this.h.invoke(this, m0, null)).intValue(); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final void doSomething() throws { try { this.h.invoke(this, m3, null); return; } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final void somethingElse(String paramString) throws { try { this.h.invoke(this, m4, new Object[] { paramString }); return; } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final String toString() throws { try { return (String)this.h.invoke(this, m2, null); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m3 = Class.forName("typeinfo.Interface").getMethod("doSomething", new Class[0]); m4 = Class.forName("typeinfo.Interface").getMethod("somethingElse", new Class[] { Class.forName("java.lang.String") }); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); return; } catch (NoSuchMethodException localNoSuchMethodException) { throw new NoSuchMethodError(localNoSuchMethodException.getMessage()); } catch (ClassNotFoundException localClassNotFoundException) { throw new NoClassDefFoundError(localClassNotFoundException.getMessage()); } } }
通过源代码我们不难看出,代理类是如何调用invoke方法的了。
评论
我也不怕了!!
专业从事磁带机、磁带库、磁盘阵列、信息化建设、存储系统的业务,全方位提供网络数据安全解决方案和系统集成服务。
作为一家具有较强综合实力的公司目前主要代理如下产品:
HP公司磁带机、磁带库等存储系统增值代理;
IBM公司磁带机、磁带库存储系统中国代理;
Quantum公司存储产品最佳合作伙伴;
Veritas、Bakbone、备份软件代理;
EMC、SUN磁盘阵列产品专业代理;
网络视频监控服务器
专业磁盘存储厂商
Tel:021-62111580 62113278
Mobile:13636302561沪、13761648996、
Mail: info@storage81.com
QQ:873372631
竟然有人在这里做广告,要怎么把它删掉
这个家伙到处乱贴,请管理员速度封其号。
专业从事磁带机、磁带库、磁盘阵列、信息化建设、存储系统的业务,全方位提供网络数据安全解决方案和系统集成服务。
作为一家具有较强综合实力的公司目前主要代理如下产品:
HP公司磁带机、磁带库等存储系统增值代理;
IBM公司磁带机、磁带库存储系统中国代理;
Quantum公司存储产品最佳合作伙伴;
Veritas、Bakbone、备份软件代理;
EMC、SUN磁盘阵列产品专业代理;
网络视频监控服务器
专业磁盘存储厂商
Tel:021-62111580 62113278
Mobile:13636302561沪、13761648996、
Mail: info@storage81.com
QQ:873372631
竟然有人在这里做广告,要怎么把它删掉
发表评论
-
毕业两年我学到了什么
2010-06-04 14:34 1289明天就要离开我现在的 ... -
浅析java回调机制与观察者模式
2010-06-02 10:38 42211 java回调机制: 首先解释java回调机制,对象能够携 ... -
java编程思想第四版勘误下载
2010-05-25 17:08 1242此文档是在CSDN下载的,提供javaeye社区下载 -
java泛型通配符-协变与逆变
2010-05-24 12:36 5682周末研究了下java泛型,关于泛型通配符的协变与逆变问题,题目 ... -
java反射机制-通过非默认构造器创建对象
2010-05-21 12:27 3631今天研究了下java反射机制,并利用反射机制,通过非默认构造器 ... -
浅谈非静态内部类不能有静态成员
2010-05-05 23:09 41571 非静态内部类为什么不能有静态成员,我自己总结了下, 如下 ... -
类的初始化顺序
2010-05-02 10:39 11961 对于继承来讲,初始化次序大致如下: 1)父类的静态变量和 ... -
解决ArrayList的ConcurrentModificationException
2010-04-15 22:19 251411 问题 :在list<String> 中清 ... -
日期的加减法
2010-03-24 15:30 1872今天小试了日期的加减法,功能实现了,但觉得代码很长,有更好的解 ... -
JDK1.5 新特性
2009-07-08 11:12 878"JDK1.5"的一个重要主题就是通过新增 ... -
JAVA反射机制的学习
2009-07-07 14:07 1100原文:http://www.iteye.com/t ... -
JAVA多线程
2009-07-02 14:14 993原文出处:http://www.iteye.com/topic ... -
java虚拟机的类装载
2009-06-25 17:19 822原文出处:http://webservices.ctocio. ... -
JAVA面试试题解惑系列(创建几个String对象)
2009-06-22 15:33 1147作者:臧圩人(zangweiren) 网址:http:/ ... -
JAVA面试题解惑系列(类的初始化顺序)
2009-06-22 10:57 848网址:http://zangweiren.iteye.com ... -
java参数传递总结
2008-12-13 12:53 946以前学习C的 时候参数传递的方式有两种,一种叫"值传 ...
相关推荐
Java反射机制与动态代理是Java编程中的重要概念,它们在软件设计中扮演着核心角色,尤其是在框架开发中。本文将深入探讨这两个主题,以及如何在实际应用中利用它们。 首先,我们来理解Java反射机制。反射是Java的一...
总结起来,Java反射机制和动态代理是强大的编程工具,它们允许程序员在运行时探索和操作类的内部结构,实现动态行为和扩展功能。然而,使用时应谨慎,因为它们也可能引入性能问题和安全风险。在适当的情况下,反射和...
JAVA反射机制与动态代理.part04
JAVA反射机制与动态代理.part01
JAVA反射机制与动态代理.part02
JAVA反射机制与动态代理.part05
JAVA反射机制与动态代理.part03
1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...
JAVA反射机制与动态代理.part07
JAVA反射机制与动态代理.part06
JAVA反射机制与动态代理.part08
JAVA反射机制与动态代理.part09
综上所述,Java反射机制与动态代理是Java开发中的高级特性,它们使得程序在运行时具有更高的灵活性和扩展性。掌握这两个概念对于理解Java的深层机制和开发复杂系统至关重要。同时,了解如何处理文件上传下载,尤其是...
总的来说,这份“JAVA反射机制与动态代理综合资料”应该是一个全面的学习资源,涵盖了从基础概念到实际应用的多个方面,对于想要提升Java技能或深入理解J2EE开发的程序员来说,是非常宝贵的学习材料。通过学习和实践...