有没有办法找出创建了哪个 class 实例 'this'
Is there a way to find out which class instance created 'this'
**我(class 的一个实例)想知道是哪个 class 实例化了我?
我有一个由 Class A 和 Class B 实例化的 class C。我想找出哪个 class 实例化了我,以便我可以从中访问变量class.
通常的方法是传入一个标识符,嘿我来自class A,并在构造函数中传入变量x,供C以适合它的方式使用。
**
例如:
public Class A
{
public int x;
public A()
{
C c = new C();
}
}
public Class B
{
public int x;
public B()
{
C c = new C();
}
}
public Class C
{
public CMethod()
{
// I want Access int x from the class that instantiated me.
if I know its B then B.x ...
}
}
不经过一些黑客攻击就无法知道(见下文)。这看起来像是一个接口的案例……
类 A 和 B 定义了具有 getX() 方法的 HasX。您可以将 class 传递给 C 的构造函数,它期望任何实现 HasX 的 class。然后 C 可以在任一对象上调用 getX,它不需要知道它实际是哪种类型,但它会得到适当的 X 值。
public interface HasX {
public int getX();
}
public class A implements HasX {
private int x;
public A()
{
C c = new C(this);
}
public int getX() {
return x;
}
}
public class B implements HasX {
private int x;
public B() {
C c = new C(this);
}
public int getX() {
return x;
}
}
public class C {
HasX hasX;
public C(HasX hasX) {
this.hasX = hasX;
}
public void doStuff() {
int x = hasX.getX();
}
}
为了回答你原来的问题,创建对象的对象没有存储在任何地方......但是你可以在构造 C 时做一些黑客攻击来找出 class。这是我曾经用于日志记录实现的一些代码,它可以通过回顾 Throwable 的 stracktrace 来检测谁是调用者。同样,这不是好的做法,但你这么问...... :)
public C() {
String whoCalledMe = whereAmI(new Throwable());
}
private String whereAmI(Throwable throwable) {
for (StackTraceElement ste : throwable.getStackTrace()) {
String className = ste.getClassName();
// search stack for first element not within this class
if (!className.equals(this.getClass().getName())) {
int dot = className.lastIndexOf('.');
if (dot != -1) {
className = className.substring(dot + 1);
}
return className + '.' + ste.getMethodName();
}
}
return "";
}
您可能希望将其编辑为简单的 return class 名称,或者甚至执行 Class.forName() 来解析实际的 class.
如果您想要实际的对象,并且每个 class 中只有 1 个,您可以在以 classname 为关键字的地图中输出对象。但是天哪,周围真是一团糟:)
**我(class 的一个实例)想知道是哪个 class 实例化了我? 我有一个由 Class A 和 Class B 实例化的 class C。我想找出哪个 class 实例化了我,以便我可以从中访问变量class.
通常的方法是传入一个标识符,嘿我来自class A,并在构造函数中传入变量x,供C以适合它的方式使用。
**
例如:
public Class A
{
public int x;
public A()
{
C c = new C();
}
}
public Class B
{
public int x;
public B()
{
C c = new C();
}
}
public Class C
{
public CMethod()
{
// I want Access int x from the class that instantiated me.
if I know its B then B.x ...
}
}
不经过一些黑客攻击就无法知道(见下文)。这看起来像是一个接口的案例……
类 A 和 B 定义了具有 getX() 方法的 HasX。您可以将 class 传递给 C 的构造函数,它期望任何实现 HasX 的 class。然后 C 可以在任一对象上调用 getX,它不需要知道它实际是哪种类型,但它会得到适当的 X 值。
public interface HasX {
public int getX();
}
public class A implements HasX {
private int x;
public A()
{
C c = new C(this);
}
public int getX() {
return x;
}
}
public class B implements HasX {
private int x;
public B() {
C c = new C(this);
}
public int getX() {
return x;
}
}
public class C {
HasX hasX;
public C(HasX hasX) {
this.hasX = hasX;
}
public void doStuff() {
int x = hasX.getX();
}
}
为了回答你原来的问题,创建对象的对象没有存储在任何地方......但是你可以在构造 C 时做一些黑客攻击来找出 class。这是我曾经用于日志记录实现的一些代码,它可以通过回顾 Throwable 的 stracktrace 来检测谁是调用者。同样,这不是好的做法,但你这么问...... :)
public C() {
String whoCalledMe = whereAmI(new Throwable());
}
private String whereAmI(Throwable throwable) {
for (StackTraceElement ste : throwable.getStackTrace()) {
String className = ste.getClassName();
// search stack for first element not within this class
if (!className.equals(this.getClass().getName())) {
int dot = className.lastIndexOf('.');
if (dot != -1) {
className = className.substring(dot + 1);
}
return className + '.' + ste.getMethodName();
}
}
return "";
}
您可能希望将其编辑为简单的 return class 名称,或者甚至执行 Class.forName() 来解析实际的 class.
如果您想要实际的对象,并且每个 class 中只有 1 个,您可以在以 classname 为关键字的地图中输出对象。但是天哪,周围真是一团糟:)