如果我知道它的ClassLoader(ClassLoader命名空间),我可以在运行时在Java中获取类的实例吗?

时间:2014-02-25 20:54:14

标签: java jsf jvm classloader managed-property

我只是想知道如果我知道它的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功能?

2 个答案:

答案 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是如何工作的,但通常你的框架会查找它识别的特殊注释,它包含用于设置这些字段的实例,或者它有工厂来创建实例。