簡體   English   中英

如果我知道它的ClassLoader(ClassLoader命名空間),我可以在運行時在Java中獲取類的實例嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM