gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:09:24 28 4
gpt4 key购买 nike

我只是想知道如果我知道类加载器,我是否可以在 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 的例子。

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

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

然后容器负责解析 @Value 内的表达式注解并将相应的值注入(inject)copyValueOfThatField field 。

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

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

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

关于java - 如果我知道 Java 类的 ClassLoader(ClassLoader 命名空间),我可以在运行时获取该类的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025959/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com