Java 获取当前类对象
我有三节课。。A、 B,CJava 获取当前类对象,java,Java,我有三节课。。A、 B,C 在B类和C类中,我都有一个静态字符串变量“name”,它包含B和C的名称,如下所示- 我正在从类B和C调用类A的getName方法。。甲级考试成绩如下: 甲级 { 丙类为: 现在我的问题是,我应该用什么代码来代替类A中的“this class called me”,这样我就可以得到调用A的类的名称!我希望我很清楚!!你的A.getName方法无法知道类的代码调用了它。你必须将这些信息传递给它 好吧,严格来说这不是真的,你可以通过生成一个堆栈跟踪并检查它来找出它。但这是
现在我的问题是,我应该用什么代码来代替类A中的“this class called me”,这样我就可以得到调用A的类的名称!我希望我很清楚!!你的
A.getName
方法无法知道类的代码调用了它。你必须将这些信息传递给它
好吧,严格来说这不是真的,你可以通过生成一个堆栈跟踪并检查它来找出它。但这是一个非常糟糕的主意。一般来说,如果一个方法需要知道一些东西,你要么a)使它成为一个实例的一部分,将该信息作为实例数据,要么B)将该信息作为参数传递给它。听起来像你真正想做的是把信息从一个堆栈帧传递到另一个堆栈帧,特别是从一个帧a到一个帧B,其中a调用了B。这是一件容易的事情,我认为你设计得太过了
class A {
getName()
{
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
int lastStackElement = stackTraceElements.length-1;
String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
System.out.println(callingObjectsName + " called me.");
}
}
public class B {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class C {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class A {
public static void getName(String name) {
System.out.println(name);
}
}
你的方法需要:
Class.forName
获取Class
对象类对象调用getField(“name”)
,以获取字段对象
字段
表示字符串类型的静态字段字段上调用get(null)
以获取其值(null
表示需要该字段的对象——由于该字段是静态的,因此不绑定到任何对象,因此忽略此参数),并将此值向下转换为String
您的方法还要求
name
字段是静态的,因为无法获取调用实例(即使您可以获取调用实例的类)。即使name
是一个实例字段,更简单的方法也可以使用。因此,这意味着在类B和类Ci中都定义了thisclasscalledme.name?name,并且希望访问调用DME的名称变量的类。这是all@user975234你知道什么是静态的吗?@user975234:同样,你不能(合理地)获取调用a.getName
函数的代码类的引用。需要这样做是一个设计问题,应该通过修改设计来解决。我建议您提出一个单独的问题,概述实际的最终目标,显示完整但简短的(编译)举例说明您尝试了什么,并询问您哪里出了问题(您几乎肯定希望使用类的实例,而不是静态方法)我想访问调用DME的名称变量的类。仅此而已。我不需要任何堆栈跟踪!!@user975234尝试更新。要访问类名称,您需要检查堆栈跟踪。@Shawn我只提供武器,他们对它们造成的伤害是他们自己的事。J/K这很好!但是你能不能清楚它会造成什么伤害!:P@user975234与其说是代码造成了破坏,还不如说是您如何在需要查找调用类名称的第一时间找到了位置。恕我直言,这就是所谓的代码“气味”,因为有些东西闻起来很怪,所以你面临的问题很可能会用更好的设计来解决。我相信这就是TJ所指的。
class C
{
static name;
public static void main(String args[])
{
name="Class C";
A.getName();
}
class A {
getName()
{
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
int lastStackElement = stackTraceElements.length-1;
String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
System.out.println(callingObjectsName + " called me.");
}
}
Modify your code to something like this:
class A
{
getName(String className)
{
System.out.println(className);
}
}
and use it like :
class B
{
static name;
public static void main(String args[])
{
name="Class B";
A.getName(name);
}
}
public class B {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class C {
static String name = ...
public static void main(String[] args) {
A.getName(name);
}
}
public class A {
public static void getName(String name) {
System.out.println(name);
}
}