0

我只是想知道如果我知道它的类加载器,是否可以在 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 功能?

4

2 回答 2

2

不,您不能从 a 获取给定类型的实例ClassLoader。如何ClassLoader能够识别您想要的实例?

你需要一些其他类型的逻辑。和 Peter 一样,我不知道 JSF 究竟是如何做到的,所以我将举一个 Spring 的例子。

在提供 Inversion of Control 容器的 Spring 中,您声明您的 bean。这些由容器管理,即。容器存储它们并控制它们的整个生命周期。如果您在这些 bean 的类之一中有一个字段声明为

@Value("${someBean.someField}")
private String copyValueOfThatField;

然后容器负责解析@Value注解中的表达式并将相应的值注入到copyValueOfThatField字段中。

在这种情况下,它将使用某个组件遍历容器中注册的所有 bean,找到名为的 bean someBean,并尝试检索其someField属性的值。

您将在后台进行大量反射以获取对象字段的值。

JSF 本身就是一个容器,并且可能执行与上述类似的操作。该术语的使用Managed应该告诉您这一点。

于 2014-02-25T21:11:00.717 回答
0

要获取实例,您必须在某处拥有一个集合,该集合保留该实例以供查找。我不知道 JSF 是如何具体工作的,但通常您的框架会查找它识别的特殊注释,并且它包含用于设置这些字段的实例,或者它具有创建实例的工厂。

于 2014-02-25T21:04:33.827 回答