一个Class能不能知道自己被谁(Class)创建实例?或在其某方法中直接获取调用此方法的Class的名称?

myy 2005-02-03 09:38:49
比如
class A
{
public void M(){
System.out.print(调用Class的类名);//打印 "B"
}
}

...
class B
{
...
A a=new A();
A.M();
...
}
...全文
385 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
myy 2005-02-21
  • 打赏
  • 举报
回复
我终于知道了!

看了下面这篇文章,唉,说什么好呢?!·#¥%……—*()

http://www.csdn.net/csdn/csdnClick.aspx?ad=FP_TA_Java_List&adurl=http%3a%2f%2fblog.csdn.net%2fbuaawhl%2farchive%2f2005%2f01%2f18%2f257653.aspx

这是例子(jdk1.4),在任何一个函数中调用,测试一下看看吧...

public static void printCaller(){
int i;
StackTraceElement stack[] = (new Throwable()).getStackTrace();
for (i=0; i < stack.length; i++) {
StackTraceElement ste=stack[i];
System.out.println(i+"--"+ste.getClassName());
System.out.println(i+"--"+ste.getMethodName());
System.out.println(i+"--"+ste.getFileName());
System.out.println(i+"--"+ste.getLineNumber());
}
}
binny 2005-02-15
  • 打赏
  • 举报
回复
感觉是不可以

不过变通一下,new 一个Exception

然后根据他的StackTrace应该就可以了吧

关注,

希望有更好的方法
Squall1009 2005-02-15
  • 打赏
  • 举报
回复
谁能用反射写个出来让大家看看吗?
hollysky 2005-02-15
  • 打赏
  • 举报
回复
当然是不可以!
EverythingMaster 2005-02-15
  • 打赏
  • 举报
回复
如果真的可以实现,用处还是有的,这样可以“透明”的跟踪函数或类的
运行时调用路线图,对于调试、分析程序提供很大方便。
-----------------------------------------------------------
我看这个根本就和调试之类的不相关。我如果都不知道我的类调用了什么方法,我还怎么调试?我还怎么分析程序?我既然知道了我调用了哪些方法,我为什么还要去管还有没有其他类也调用了这些方法呢?你写一个工具类,目的不就是要给别人使用的吗?为什么要在意是谁使用了这个工具类呢?这样做根本就没有任何意义。这个跟“ 这样可以“透明”的跟踪函数或类的运行时调用路线图 ”这样的说法简直毫无相关。不知道你从哪里想出来的什么所谓调用路线图的说法。
你可以想想:sun提供了这个多类供我们使用,它会在每个类里面记录究竟是哪些类对其进行了调用吗?
这样做不是有病是什么?
yingle2000 2005-02-15
  • 打赏
  • 举报
回复
StackTrace就能知道堆栈了,method的调用一目了然。
NTMDQUSI 2005-02-04
  • 打赏
  • 举报
回复
再强调一下:

A.M() 不能有参数,A的构造函数也没有参数!

A.M(this), new A(this)...之类的办法我都明白,不然我也不会提问了。

不寫清楚都不行,在A中添加方法
public void Func()
{
Class aClass = this.getClass();
System.out.println(aClass.getName());
}
或者
A()
{
Class aClass = this.getClass();
System.out.println(aClass.getName());
}
沒人非要你傳參數啊
myy 2005-02-04
  • 打赏
  • 举报
回复
zd
myy 2005-02-04
  • 打赏
  • 举报
回复
再强调一下:

A.M() 不能有参数,A的构造函数也没有参数!

A.M(this), new A(this)...之类的办法我都明白,不然我也不会提问了。
myy 2005-02-04
  • 打赏
  • 举报
回复
哎,说来说去,構造方法, 一般方法,都是要传参的。

A 对 调用它的类一无所知,不能传任何参数,行不行?
snbna 2005-02-04
  • 打赏
  • 举报
回复
:)
:)
NTMDQUSI 2005-02-04
  • 打赏
  • 举报
回复
在A類的方法中加入Class aClass = this.getClass();

構造方法也行 一般方法也行
這樣做就能得到當前類的信息
然後可以通過java.lang.Class類的方法獲得類的信息

比如aClass.getName()
myy 2005-02-04
  • 打赏
  • 举报
回复
谢谢 loveyousomuch(★Allen★) ,小弟很菜,研究ing ...
以梦为马 2005-02-04
  • 打赏
  • 举报
回复
up
lvyuanfang 2005-02-04
  • 打赏
  • 举报
回复
class A
{
public void M(){
//如果是B调用我 ,打印 "B" ,如果是C调用我,打印"C"
//问题在于如何判断是B还是C ????
System.out.print(...);
}
}

...
class B
{
...
A a=new A();
A.M();
...
}

...
class C
{
...
A a=new A();
A.M();
...
}
...


更改为

class A
{
public void M(Class class){
//如果是B调用我 ,打印 "B" ,如果是C调用我,打印"C"
//问题在于如何判断是B还是C ????
System.out.print(class.getName());
}
}

...
class B
{
...
Class class=this.getClass();
A a=new A();
A.M(class);
...
}

...
class C
{
...
Class class=this.getClass();
A a=new A();
A.M(class);
...
}
loveyousomuch 2005-02-04
  • 打赏
  • 举报
回复
楼主可以查一下反射类来实现
myy 2005-02-04
  • 打赏
  • 举报
回复
传参谁都会啊 ,我还可以直接传 String的名称呢,问题是不传参行不行?

我的目的是:

每当有类调用 A.M() 时,A.M() 就可以打印出调用者的相关信息,这样,就可以
跟踪A.M() 被调用的情况,而不必在所有调用A.M()的地方象下面这样写:

A a=new A();
A.M();
System.out.println("我是"+this.getClass().getName()+",刚刚调用了A.M()");
EverythingMaster 2005-02-04
  • 打赏
  • 举报
回复
类A应该这样设计:
class A {
public static ArrayList list = new ArrayList();
public A(Object obj) {
list.add(obj);
for (int i=0;i<list.size();i++){
System.out.println(list.index(i));
}
}
}

类B可以这样调用:
class B {
public void someMethod(){
new A(this);
}
}

只是一种想法,还没有测试。
cless 2005-02-04
  • 打赏
  • 举报
回复
楼上的方法可行,不过应该还可以改进一下,用this.getClass().getName()就可以得到楼主要的东西了吧。
jcw2016 2005-02-04
  • 打赏
  • 举报
回复
楼上的这个方法就是说,在调用A的方法时传一个参数告诉A:现在是我B在调用你的方法。这样就改变了楼主定义的接口。不过好象也只有这种方法了。
加载更多回复(14)

81,091

社区成员

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

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