我只是想知道如果我知道它的Classloader,我是否可以在JVM运行时获取类的实例(引用一个Object)。请参阅下面的代码以了解我的问题。
A类:
package local.run;
public class A {
public static void main(String[] args) {
B b = new B();
b.setCount(5);
C c = new C();
c.dummyMethod();
b.printCount();
}
}
B组:
package local.run;
public class B {
public int count = 0;
public void setCount(int aCount) {
count = aCount;
}
public void printCount() {
System.out.println(count);
}
}
C类:
package local.run;
public class C {
public void dummyMethod() {
// Can I get the instance of class B created in class A here?
// I don't want to pass the instance of class B as a parameter to this method.
System.out.println("ClassLoader Namespace -> "+B.class.getProtectionDomain().getCodeSource().getLocation());
// I know the ClassLoader Namespace of class B
// How to get instance of class B created in class A???
System.out.println(b.count); // I wan't to print 5
}
}
如果这不可能,那么我只是想知道JSF如何实现@ManagedProperty功能?
答案 0 :(得分:2)
不,您无法从ClassLoader
获取给定类型的实例。 ClassLoader
如何识别您想要的实例?
你还需要其他一些逻辑。和Peter一样,我不知道JSF是如何完成的,所以我将以Spring为例。
在提供Inversion of Control容器的Spring中,您声明了bean。这些由容器管理,即。容器存储它们并控制它们的整个生命周期。如果在其中一个bean类中有一个字段声明为
@Value("${someBean.someField}")
private String copyValueOfThatField;
然后容器负责解析@Value
注释中的表达式并将相应的值注入copyValueOfThatField
字段。
在这种情况下,它将使用一些组件遍历容器中注册的所有bean,找到名为someBean
的bean,并尝试检索其someField
属性的值。
您将在后台进行大量反射以获取对象字段的值。
JSF本身就是一个容器,可能会做与上面类似的事情。使用术语Managed
应该告诉您。
答案 1 :(得分:0)
要获取实例,您必须拥有一个保留查找实例的集合。我不知道JSF是如何工作的,但通常你的框架会查找它识别的特殊注释,它包含用于设置这些字段的实例,或者它有工厂来创建实例。