java某方法在写代码时,如何得知运行时将要调用它的方法的名称及其所在类名?(很难的,请赐教,送您100)

furarmy 2002-03-02 02:40:17
java某方法在写代码时,如何得知运行时将要调用它的方法的名称及其所在类名?

说明:
某方法doReturn()将会被很多很多方法所调用。而它的实现内容却与调用它的方法的名称有关,也就是说,调用者不同,实现的功能不同。因此,如何在写代码时就知道调用者的信息?????
...全文
157 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
hccpro 2002-03-08
  • 打赏
  • 举报
回复
路人甲用的就是java的反射机制,很多书上都有写啊!
furarmy 2002-03-06
  • 打赏
  • 举报
回复
各位高手还有良策吗?
furarmy 2002-03-06
  • 打赏
  • 举报
回复
那么就谢谢各位了。
jimjxr 2002-03-05
  • 打赏
  • 举报
回复
“但如何能做到一次编码,就能在不同jvm上都能解析得到类和方法名呢?”这个只能试验了,呵呵,sun的JVM间应该差别不大。总的来说,Java API没有这方面的功能,所以只能凑合了,要么就得用C了。
chenlang 2002-03-05
  • 打赏
  • 举报
回复
猫哥,我想如果能实现这个功能的话,答案一定在Java虚拟机规范中。我想,因为在进行函数调用时是使用的堆栈,那么可以通过堆栈找出相关的信息的。马上要吃饭了,下午再来看规范吧!
furarmy 2002-03-05
  • 打赏
  • 举报
回复
“路人甲”大虾的代码我是明白了,但用意我不是很明白。
MakeTodayClass类用来动态生成一个类然后调用其方法,但这与我的问题没有联系呀。
请指教
chenlang 2002-03-05
  • 打赏
  • 举报
回复
和这个主题有关吗?
Patrick_DK 2002-03-05
  • 打赏
  • 举报
回复
甲哥,你是我的偶像!
(您老中饭还没吃吧:))
xmvigour 2002-03-05
  • 打赏
  • 举报
回复
忍不住,再说一下,skyyoung(路人甲) 高!
xmvigour 2002-03-05
  • 打赏
  • 举报
回复
阅~
wafer_w 2002-03-05
  • 打赏
  • 举报
回复
高!
skyyoung 2002-03-05
  • 打赏
  • 举报
回复
import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class MakeTodayClass {
Date today = new Date();
String todayMillis = Long.toString(today.getTime());
String todayClass = "z_" + todayMillis;
String todaySource = todayClass + ".java";

public static void main (String args[]){
MakeTodayClass mtc = new MakeTodayClass();
mtc.createIt();
if (mtc.compileIt()) {
System.out.println("Running " + mtc.todayClass + ":\n\n");
mtc.runIt();
}
else
System.out.println(mtc.todaySource + " is bad.");
}

public void createIt() {
try {
FileWriter aWriter = new FileWriter(todaySource, true);
//aWriter.write("package com;");
aWriter.write("public class "+ todayClass + "{");
aWriter.write(" public void doit() {");
aWriter.write(" System.out.println(\""+todayMillis+"\");");
aWriter.write(" }}\n");
aWriter.flush();
aWriter.close();
}
catch(Exception e){
e.printStackTrace();
}
}

public boolean compileIt() {
String [] source = {"-d","d:/",new String(todaySource) };
ByteArrayOutputStream baos= new ByteArrayOutputStream();

//new sun.tools.javac.Main(baos,source[0]).compile(source);
// if using JDK >= 1.3 then use
System.out.println(com.sun.tools.javac.Main.compile(source));
System.out.println("================"+new String(baos.toByteArray()));
return (baos.toString().indexOf("error")==-1);
}

public void runIt() {
try {
Class params[] = {};
Object paramsObj[] = {};
Class thisClass = Class.forName(todayClass);
Object iClass = thisClass.newInstance();
Method thisMethod = thisClass.getDeclaredMethod("doit", params);
thisMethod.invoke(iClass, paramsObj);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
wafer_w 2002-03-05
  • 打赏
  • 举报
回复
既然你运行的时候才能知道有什么类来调用你的方法,那么, bdsc 的方法我认为是最好的了,否则,即使你能够得到调用你方法的类名,你也需要在doReturn()方法中一一列举你的处理方法,如果突然要增加一个新的类来调用你的方法呢?怎么办,难到开发者还要通知你修改你的方法?与其这样,不如声明你的接口,在调用者的类中实现(可以让调用者继承这个接口或采用其它设计模式)。
furarmy 2002-03-05
  • 打赏
  • 举报
回复
对呀,使用Exception的printStackTrace可以得到,但如何能做到一次编码,就能在不同jvm上都能解析得到类和方法名呢?
furarmy 2002-03-05
  • 打赏
  • 举报
回复
请教“宝宝猫”大虾,这个功能如果用C写应怎样写?

另外,我也想到应该与jvm有关的,但只有产生异常时能得到堆栈信息,调用如下:
public void Invoker(){
.....
Exception e = new Exception();
doReturn(e);
.....
}
如上是可以完全实现此功能的,但这样有点投机取巧,我想实在不行就这样做,但最好能够直接得到堆栈信息。
所以我仍在思考。

hanson_yi 2002-03-05
  • 打赏
  • 举报
回复
doReturn(Object b)
{
b.getClass().getName()//??可以吗?

}
jimjxr 2002-03-05
  • 打赏
  • 举报
回复
SecurityManager有一个getClassContext()方法,如果只需要类名,可以考虑用这个,但你得自己extend一个SecurityManager,因为这个方法是protected。另外一个方法就是生成一个Exception,然后调printStackTrace(...),打印到字符串中,然后解析字符串,得到所有的类和方法。注意打印格式可能随JVM的不同而改变。
hccpro 2002-03-04
  • 打赏
  • 举报
回复
如果你发现自己漩入了一个几乎无法解决的漩涡,

那么就说明你最初的设计就出了问题!!

任何程序高手也不能让别人什么也不动就可以在自己这边搞定一切!!!
furarmy 2002-03-04
  • 打赏
  • 举报
回复
不行的。有多少类根本不可预知。
think again!
Thank you!!
csdn_cloud 2002-03-04
  • 打赏
  • 举报
回复
public class XX
{
static void doReturn( Object obj )
{
if( obj instanceof XYZ )
....
....
}
}

很恶心得办法
加载更多回复(8)

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧