为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取Java中调用类的名称?

如何获取Java中调用类的名称?

白衣染霜花 2019-11-04 09:54:00
在这件事上,我需要一些帮助,例:public class A {    private void foo() {          //Who Invoked me    }}public class B extends A { }public class C extends A { }public class D {     C.foo();}基本上是这种情况。我的问题是方法如何foo()知道谁在调用它?编辑:基本上我正在尝试做一个数据库层,并且在类AI中将创建一个将生成SQL语句的方法。通过获取调用类的所有公共属性的值来动态生成此类语句。
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

最简单的方法如下:


String className = new Exception().getStackTrace()[1].getClassName();

但是实际上,除非出于某些日志记录目的,否则不需要这样做,因为这是一项相当昂贵的任务。这是什么,您认为这是解决的问题?我们可能会提出更好的建议。


编辑:您评论如下:


基本上,我正在尝试做一个数据库层,在A类中,我将创建一个将生成sql语句的方法,通过获取调用类的所有公共属性的值来动态生成此类语句。


然后,我强烈建议您寻找一个现有的ORM库,例如Hibernate,iBatis或任何JPA实现。


查看完整回答
反对 回复 2019-11-04
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

Java 9:堆栈漫游API

JEP 259为堆栈遍历提供了有效的标准API,可轻松过滤和延迟访问堆栈跟踪中的信息。首先,您应该获得的实例StackWalker:


import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;

// other imports


StackWalker walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);

您可以调用该getCallerClass()方法:


Class<?> callerClass = walker.getCallerClass();

无论如何配置StackWalker实例,该getCallerClass方法都将忽略反射帧,隐藏帧以及与MethodHandles 相关的帧。另外,该方法不应当被所述第一堆栈帧上调用。


查看完整回答
反对 回复 2019-11-04
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

也许对于您的用例,将调用者的类传递给方法是有意义的,例如:


public class A { public void foo(Class<?> c) { ... } }

并这样称呼它:


public class B { new A().foo(getClass() /* or: B.class */ ); }


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信