获取是否使用反射创建对象?

时间:2016-03-08 09:29:10

标签: java reflection

我有一个无法解决的请求:

假设我有这门课程:

    public class DummyPoint {

        private int x;
        private int y;
        private final String id;

        /**
         * @param x
         * @param y
         */
        public DummyPoint(int x, int y) {
            this.x = x;
            this.y = y;
            if(am getting created by reflection??) {
                this.id = UUID.randomUUID().toString();
            }else {
                this.id = "Reflected";
            }
        }
...
    }

在我的项目中, DummyPoint 类可以通过以下方式实例化:

DummyPoint dp  = new DummyPoint(0,0);
dp.getX();
dp.getY();
dp.getId();

但是它也可以通过反射生成:

问题:

我想知道我是否可以区分反射生成的对象,或者就像我在构造函数中尝试做的那样。

这可能吗???

到目前为止我尝试了什么:

final DummyPoint dp0 = DummyPoint.class.getConstructor(int.class, int.class).newInstance(0, 0);
final DummyPoint dp1 = new DummyPoint(0, 0);

// ??????
System.out.println(dp0.getId());
System.out.println(dp1.getId());

但两个对象都没有显示具体的差异以便做出选择。

感谢

1 个答案:

答案 0 :(得分:4)

我不知道这是否是完成任务的最佳方法。但您可以通过检查当前调用堆栈并检查它是否包含对反射方法的调用来确定它。一个粗略的实现将是这样的。将此方法添加到DummyPoint

public boolean isUsingReflection() {
    StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    for (StackTraceElement stackElement : stack) {
        String className = stackElement.getClassName();
        String methodName = stackElement.getMethodName();
        if("java.lang.reflect.Constructor".equals(className) &&
                "newInstance".equals(methodName)) {
            return true;
        }
    }
    return false;
}

并像这样修改你的构造函数

public DummyPoint(int x, int y) {
    this.x = x;
    this.y = y;

    if(!isUsingReflection()) {
        this.id = UUID.randomUUID().toString();
    }else {
        this.id = "Reflected";
    }
}