[英]Can I get an instance of a class in Java during runtime if I know its ClassLoader (ClassLoader Namespace)
我只是想知道如果我知道它的类加载器,我是否可以在JVM运行时获取类的实例(引用一个对象)。 请参阅下面的代码以了解我的问题。
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功能?
不,您无法从ClassLoader
获取给定类型的实例。 ClassLoader
如何识别您想要的实例?
你需要一些其他的逻辑。 像Peter一样,我不知道JSF是如何完成的,所以我将举一个Spring的例子。
在提供Inversion of Control容器的Spring中,您声明了bean。 这些由容器管理,即。 容器存储它们并控制它们的整个生命周期。 如果您在其中一个bean类中声明了一个字段
@Value("${someBean.someField}")
private String copyValueOfThatField;
然后容器负责解析@Value
注释中的表达式,并将相应的值注入copyValueOfThatField
字段。
在这种情况下,它将使用一些组件遍历容器中注册的所有bean,找到名为someBean
,并尝试检索其someField
属性的值。
您将在后台进行大量反射以获取对象字段的值。
JSF本身就是一个容器,可能与上面的东西类似。 使用“ Managed
”一词应该告诉你。
要获取实例,您需要在某处保留用于查找的实例的集合。 我不知道JSF是如何具体工作的,但通常你的框架会查找它识别的特殊注释,它包含用于设置这些字段的实例,或者它有工厂来创建实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.