简述Invoke实践过程简述

Java动态代理 InvocationHandler接口的invoke方法,是JDK实现的方法,还是程 序员自己实现的invoke方法。_百度知道
Java动态代理 InvocationHandler接口的invoke方法,是JDK实现的方法,还是程 序员自己实现的invoke方法。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(&调用被代理对象的方法是:&+method.getName()+&
&+method.getDeclaringClass());
System.out.println(&之前设置新行为& );
method.invoke(sub,args); //动态调用被代理类的行为方法。
System.out.println(&之后设置新行为& );
}method.invoke(sub,args);
这个方法是实现的那里的 invoke 方法。就是public Object invoke(Object proxy, Method method, Object[] args)
这三个参数,我对应不上,还不知道 invoke 方法是JDK 自己提供的方法实现,还是程序员自己写的代码去实现接口的方法invoke。method.invoke(sub,args)----是不是就是InvocationHandler接口的invoke方法里的参数,还是具体方法。我是初学着,没理解上去啊,请高手解答一下,谢谢啦。
提问者采纳
method.invoke 是Java反射里面的知识就是把这个method激活。 sub这包含这个method的对象。 args就是这个method的参数值(被封装成了Object)举个例子,有个类A,实例一个对象a,类里有个public void say(String str) 的方法,获得这个method为say后:method.invoke(a,new Object[]{&this is string&});即等同于a.say(&this is string&)
你说的把method激活,是指public Object invoke(Object proxy, Method“ method”, Object[] args) 是指把 这个参数激活吗。 还是指method.invoke(sub,args) 激活这个反射。还有一点,我还没弄懂, public Object invoke(Object proxy, Method method, Object[] args) 这个方法 是InvocationHandler接口里的。用接口的话,方法必须实现的。 那这个invoke方法是在那个类里实现的啊。 还就是编程的人,自己在编写Iinvoke的。
1.我说的method激活是 method.invoke(sub,args)2.动态代理截获某个方法,在方法前方法后加东西,方法执行还是要自己 method.invoke(sub,args)
提问者评价
谢谢了,这个分就送给你了。我就是不知道接口内的方法,谁那个类去实现的功能。你提供参数,方法就返回值
其他类似问题
jdk的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁下次自动登录
现在的位置:
& 综合 & 正文
C#中BeginInvoke和EndInvoke的用法
有时候, 我们希望在当前UI线程中去做另一件费时的事, 但是我们知道:在当前UI线程中直接调用一个类似while(true)这样的操作, 我们的UI会出现无响应的情况. 如何避免这种情况呢, C#为我们准备了BeginInvoke和EndInvoke.
首先定义一个委托:
private delegate int ConsumeTimeDelegate(int iPercent);
然后写一个非常操作的方法, 当然方法的签名要和委托一致.
private int ConsumeTimeFunc(int iPercent)
int i = 0;
for(i = 0; i & 100000; i++)
Console.WriteLine(i.ToString());
iPercent =
再添加一个完成方法
private void MethodCompleted(IAsyncResult asyncResult)
if (null == asyncResult)
String str = (asyncResult.AsyncState as MyDelegate).EndInvoke(asyncResult).ToString();
Console.WriteLine("---------MethodCompleted() called. str:" + str);
最后是我们的调用方法:
ConsumeTimeDelegate consumeDelegate = ConsumeTimeF
IAsyncResult asyncResult = consumeDelegate.BeginInvoke(0, MethodCompleted, consumeDelegate);
&&&&推荐文章:
【上篇】【下篇】Java的动态代理中invoke方法是顺序执行的吗?_百度知道
Java的动态代理中invoke方法是顺序执行的吗?
提问者采纳
是这样用的吧,我的一个代码用来在方法前开启事务和方法后关闭的,执行流程应该不会有问题的,你的问题很奇怪啊
用动态代理 在getlist的方法用动态代理包装下,加入事务
import java.lang.reflect.InvocationH
import java.lang.reflect.M
import java.lang.reflect.P
import org.hibernate.*
import com.strutslet.demo.service.SystemE
public final class TransactionWrapper {/*** 装饰原始的业务代表对象,返回一个与业务代表对象有相同接口的代理对象*/public static Object decorate(Object delegate) {
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), new XAWrapperHandler(
delegate));}//动态代理技术
static final class XAWrapperHandler implements InvocationHandler {
private final O
XAWrapperHandler(Object delegate) {
this.delegate =}//简单起见,包装业务代表对象所有的业务方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result =
session = SessionFactory.getSession();try {//开始一个事务
Transaction tx = session.beginTransaction();
//调用原始业务对象的业务方法
result = method.invoke(delegate, args);
session.flush();
tx.commit();
} catch (Throwable t) {//回滚ta.rollback();
其他类似问题
invoke的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁服务热线:
400-021-8887
稳定快速,无需备案
六线访问无忧
国内/海外数据库主机
支持tomacat5/6/7,自主重启
定制网站特色
主机租用特色
主机托管特色
浅谈Hello World的Mono执行过程-中国互联
您现在的位置:&&
浅谈Hello World的Mono执行过程
大 中 小 
文章来源:
更新时间: 13:57:55
本文目的很简单,简单分析一下下面语句是如何被Mono Runtime执行的:&&
public&class&Hello1& &
&&public&static&void&Main()& &
&&&&&System.Console.WriteLine("Hello,&World!");& &
由于自己也是刚接触Mono源码,以前一直停留于简单的应用之上,所以本文的分析不全面,只是为了能大致的了解Mono的执行流程,对基本的函数和流程有所了解,所以本文的风格为流水帐。
一、先简单的看下Mono源码的目录中的几个重要文件夹:
我这里使用的是不知道什么时候下载的某个历史版本2.6.7,目前我觉得重要的就3个文件夹,mcs为base framework这里除了常见的System namespace下的各种重要程序集之外还有以Mono作为namespace的一些程序集,听雨痕说玩Mono不能错过这些程序集,有空看下;libgc文件夹里貌似是提供GC的支持库;最重要一个文件夹就是mono了,下面着重看下这个目录,这里实现的是Mono Runtime,本文调试的代码也主要是这里的。
1.arch:此目录放了各种不同处理器的差异代码,看下x86里面就两个文件x86-codegen.h和tramp.c,这个tramp.c通过调用x86-codegen.h里的各种奇怪的宏提供了两个方法mono_arch_create_method_pointer和mono_arch_create_trampoline,依这个名字看是由MonoMethod *method生成一个本机代码的指针。。。不过这两个方法太过抽象还没看懂,先放到一边。
2.io-layer:从这个目录下的各个文件名来看,这个是和操作系统打交道的,比如posix,socket,threads,semaphores,io等等,这个我很感兴趣,特别是P/Invoke是如何和这些打交道的,这一块在以后也可以做深入的分析。
3.metadata:这一块是实现cli的,比如appdomain,assembly,class&object,cominterop,exception等等,不过还有gc,coree,filewatcher等等,看来这里不只是cli的实现,还有一堆其他的东西。
4.mini:这个名字起的很奇怪,为啥叫mini呢?我猜可能是为了和mono对应吧。。。其实这里是Mono Runtime里最基础的部分,比如aot,Linear IR的jit,debugger等等,当然main函数也再这里。
5.utils和其他:utils提供一些基础设施方面的功能,比如内存分配方面的,常见的数据结构实现,以及各种工具方法。其他的几个文件夹我暂时没发现有价值的东西,先搁在一边。
二、切入正题,打断点分析源码
1.第一步尝试:找出编译的步骤和执行的入口,单步来分析执行流程。在mono_main() at driver.c里找到了main_thread_handler方法,这个是mono在解析完一系列args后的调用,这个方法是入口,接着往下看,由于没有使用mono_compile_aot,所以直接使用mono_domain_assembly_open打开程序集,执行mono_jit_exec。。。。具体的细节就不再写下去了,因为我发现这样写分析的方法没有人能看懂,我自己都懒得看。但是结果得说一下,通过这种方式我最终也没有找到再哪点输出了Hello World!把我记的笔记贴出来,换一种方法&&
&mono_main:driver.c& &
&main_thread_handler:driver.c& &
&mono_jit_exec&:driver.c& &
mono_runtime_run_main:object.c& &
&mono_runtime_exec_main:object.c& &
&mono_runtime_invoke:mini.c& &
&runtime_invoke:指针。& &
&mono_custom_attrs_from_method:reflection.c,原来是取是否要线程安全的。& &
&mono_jit_compile_method_with_opt:mini.c& &
mono_jit_compile_method_inner:MONO_USE_AOT_COMPILER& &
mono_compile_create_vars这个创建私有作用域的变量吗?& &
mono_method_get_header获取_MonoMethodHeader是做什么的?& &
&mono_arch_create_vars指定特定arch的操作。& &
&mono_method_to_ir:mono_method_to_ir.c这个好生疏阿。Translate&the&.net&IL&into&linear&IR& &
&mono_method_to_ir是一个很重要的方法,在这里实现了il的解析。& &
&mono_optimize_branches:优化分支,开始执行代码优化了,编译理论书上写的没错。&&
2.第二次尝试:找到在哪执行了向stdout上写hello world! 这一次直接一点,直接去找最终的执行函数,中间的无数步骤先忽略。最初我再源码里翻出了console-io.h这个头文件,发现这里有操作console的,然后就断点阿,每个相关的函数都断上,执行的最后只有初始化函数命中了,尝试失败。那么到底再哪点往stdout写数据呢?我再次尝试一种方法,在执行时加上--trace选项(即再terminal里执行mono --trace hello.exe && hello.trace.out),把执行流程重定向的一个文本文件中,输出了700多行,恩,我想从这里找出点线索。
1.首先在hello.trace.out文件里搜索Hello, World!字符串,找到几个匹配的地方,其中有一个是 [0xb.02866 1] ENTER: System.Console:WriteLine (string)([STRING:0x53fa0:Hello, World!], ) 从这个trace的结果上可以看出,[]包括的是地址和时间,后面跟着ENTER:,于是我就再代码里搜索ENTER:,找到/mono/mini/trace.c的342行,加上条件断点:fname = "System.Console:WriteLine",执行一下,ok,命中断点,堆栈信息如下。&
Thread&[1]&8643&(Suspended&:&Breakpoint)& &
&&&mono_trace_enter_method()&at&trace.c:342&0x80dbe6c& &
&&0xfb817c& &
&&&0xfb8225& &
&&&0xfb80f8& &
&&&mono_jit_runtime_invoke()&at&mini.c:4,789&0x8065cc1& &
&&mono_runtime_invoke()&at&object.c:2,613&0x8195d35& &
&&create_exception_two_strings()&at&exception.c:133&0x81e6a9f& &
&mono_exception_from_name_two_strings()&at&exception.c:156&0x81e6adf& &
&create_exceptions()&at&appdomain.c:185&0x818b9e4& &
&&mono_runtime_init()&at&appdomain.c:262&0x818bc0d& &
&mini_init()&at&mini.c:5,520&0x806734a& &
&&mono_main()&at&driver.c:1,623&0x80ec127& &
&main()&at&main.c:34&0x805b950&&
再看看后面几个的调用
&System.IO.SynchronizedWriter:WriteLine& &
&System.IO.TextWriter:WriteLine& &
&System.IO.UnexceptionalStreamWriter:Write& &
&System.IO.StreamWriter:Write& &
System.IO.MonoIO:Write&&
都是同样的调用堆栈,另外有关于这些System.Console相关的函数都在mono-2.6.7/mcs/class/corlib/System/Console.cs里,这个代码里有MonoLimitation和#if NET_2_1 && !MONOTOUCH部分符号,有点意思。
2.现在可以大致确定每个clr的方法调用都是由mono_jit_runtime_invoke发出的,但是我有点不解的是有三个函数没有symbol,直接显示的是函数地址,这给我的进一步分析带来了难度,来看看是为什么。执行函数返回退回到堆栈mono_jit_runtime_invoke,可以看到那几个没有符号信息的地址是由runtime_invoke这个函数执行的。转到定义,可见&&
&MonoObject&*(*runtime_invoke)&(MonoObject&*this,&void&**params,&MonoObject&**exc,&void*&compiled_method);& &
if&(!info-&dyn_call_info)& &
&&&info-&runtime_invoke&=&mono_jit_compile_method&(invoke);& &
&......& &
runtime_invoke&=&info-&runtime_& &
return&runtime_invoke&(obj,&params,&exc,&info-&compiled_method);&&
可见runtime_invoke是由mono_jit_compile_method这个方法进行jit生成的代码,怪不得找不到符号了。
3.继续深入到mono_jit_compile_method_with_opt这个动态代码生成的函数,关于jit方面的,留下次分析吧。
文章来源:,转载请注明!
相关文章:
QQ:6584830
8:00-21:00一个简单的需求的实现:
在程序中调用某类的某方法,并将返回结果println() 出来。
实现方法:
MethodTest.java
import&java.util.ArrayL
import&java.util.L
import&java.lang.reflect.M
import&java.lang.reflect.InvocationTargetE
&*&功能描述:
&*&@author&&a&href='mailto:vesung&#'&wangjing&/a&
&*&Copyright:&Copyright&(c)&&by&.
&*&Date:&&14:13:26
public&class&MethodTest{
&&&&TestVO&vo&=&new&TestVO();
&&&&/**&*//**
&&&&&*&初始化vo
&&&&protected&void&setUp(){
&&&&&&&&vo.setInvoiceSortCode("InvoiceSortCode");
&&&&&&&&vo.setInvoiceSortName("InvoiceSortName");
&&&&&&&&vo.setOperaddress("Operaddress");
&&&&&&&&vo.setStockStatus("StockStatus");
&&&&&&&&vo.setStockStatusCode("StockStatusCode");
&&&&&&&&List&list&=&new&ArrayList();
&&&&&&&&list.add("StockStatusList");
&&&&&&&&vo.setStockStatusList(list);
&&&&&&&&vo.setTaxpayerName("TaxpayerName");
&&&&&&&&vo.setTaxRegCode("TaxRegCode");
&&&&public&static&void&main(String[]&args)&throws&IllegalAccessException,&NoSuchMethodException,&InvocationTargetException&{
&&&&&&&&MethodTest&m&=&new&MethodTest();
&&&&&&&&m.setUp();
&&&&&&&&//待执行的方法名称注意没有()
&&&&&&&&String&methodName&=&"getInvoiceSortCode";
&&&&&&&&//先获取相应的method对象
&&&&&&&&//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
&&&&&&&&//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
&&&&&&&&Method&method&=&m.vo.getClass().getMethod(methodName,new&Class[<span style="color: #]);
&&&&&&&&//接下来就该执行该方法了,解释一下参数
&&&&&&&&//第一个参数是具体调用该方法的对象
&&&&&&&&//第二个参数是执行该方法的具体参数
&&&&&&&&System.out.println(methodName+"():"+method.invoke(m.vo,new&Object[<span style="color: #]));
TestVO.java
import&java.util.L
&*&功能描述:
&*&&#64;author&&a&href='mailto:vesung&#'&wangjing&/a&
&*&Copyright:&Copyright&(c)&&by&.
&*&Date:&&14:17:14
public&class&TestVO&{
&&&&private&String&taxRegC
&&&&private&String&stockStatusC
&&&&private&String&stockS
&&&&private&List&stockStatusL
&&&&private&String&taxpayerN
&&&&private&String&
&&&&private&String&invoiceSortC
&&&&private&String&invoiceSortN
&&&&public&String&
&&&&&&&&public String getInvoiceSortCode(){
&&&&&&&&&&&&&&&&return InvoiceSortC
//省略getter(),setter()

我要回帖

更多关于 简述dhcp的工作过程 的文章

 

随机推荐