我有三个班级.. A,B,C。
class B { static name; public static void main(String args[]) { name="Class B"; A.getName(); }
A班 {
getName() { System.out.println(this class called me); } }
C类是:
class C { static name; public static void main(String args[]) { name="Class C"; A.getName(); }
现在我的问题是,我应该使用什么代码代替A类中的“这个类叫我”,这样我就可以得到任何一个类叫A的名字!我希望我很清楚!!
答案 0 :(得分:2)
您的A.getName
方法无法知道哪个类的代码称之为它。你必须将这些信息传递给它。
好的,所以不是严格正确的,你可以通过生成堆栈跟踪并检查它来弄明白。但这将是一个非常糟糕的主意。通常,如果某个方法需要知道某些内容,您可以A)将其作为实例数据的实例的一部分,或者B)将信息作为参数传递给它。
答案 1 :(得分:1)
class A {
getName()
{
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
int lastStackElement = stackTraceElements.length-1;
String callingObjectsName = stackTraceElements[lastStackElement].getClassName();
System.out.println(callingObjectsName + " called me.");
}
}
答案 2 :(得分:0)
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);
}
}
答案 3 :(得分:0)
听起来你真正要做的就是将信息从一个堆栈框架传递到另一个堆栈框架 - 具体来说,从框架A传递到框架B,其中A调用B.这是一件容易的事情。做,而且我认为你过度工程了。
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")
对象上调用Class<?>
以获取Field
对象Field
表示String类型的静态字段get(null)
上调用Field
以获取其值(null
表示您想要该字段的对象 - 因为该字段是静态的,因此不会绑定到任何对象,此参数被忽略),并将此值转换为String
或者,你可以:
您的方法还要求name
字段是静态的,因为无法获取调用实例(即使您可以获取调用实例的类)。即使name
是实例字段,更简单的方法也适用。