[英]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.