在java应用当中,我们经常遇到这样一种情况,我们不希望我们的class被其他应用程序调用,
我们可以通过sun.reflect.Reflection来实现。下面来看这样一个故事。
从前有两个父亲,Tom 和 Jack ,Tom有一个儿子TomDong,可是Jack想要TomDong当自己的儿子。TomDong由于从小就没有见过父亲,没有办法辨认。Tom很伤心,于是去求太阳神sun想个办法,sun果然厉害,使用魔法将记忆加给了TomDong,于是TomDong就有了辨认父亲的能力。下面让我们来看一下sun的魔法是
怎样做到的:
//父亲Tom
public class Tom
{
public Tom()
{
}
public TomDong getChild()
{
return new TomDong();
}
}
//父亲Jack
public class Jack
{
public Jack()
{
}
public TomDong getChild()
{
return new TomDong();
}
}
//没有记忆的Tom的儿子TomDong
public class TomDong
{
public TomDong()
{
System.out.println("你好父亲!");
}
}
//测试
public class Test
{
public static void main(String[] args) {
Tom tom=new Tom();
System.out.println("Tom get TomDong:");
tom.getChild();
Jack jack=new Jack();
System.out.println("Jack get TomDong:");
jack.getChild();
}
}
运行 输出结果:
Tom get TomDong:
父亲你好!
Jack get TomDong:
父亲你好!
----------------------------------------------
显然 TomDong 不认识自己的父亲
下面是被sun加了记忆的TomDong
//有记忆的Tom的儿子TomDong
public class TomDong {
public TomDong()
{
if (Reflection.getCallerClass(2) == Tom.class)
{
System.out.println("父亲你好!");
}
else
{
System.out.println("坏蛋,我不是你的儿子!");
}
}
}
运行Test,输出结果
Tom get TomDong:
父亲你好!
Jack get TomDong:
坏蛋,我不是你的儿子!
----------------------------------------------
本文主要讲解了 sun.reflect.Reflection,0 是getCallerClass自身,1 是class自身,2 是class的调用方,3 根据类加载机制而定