在java中,据说所有类都是由类加载器加载的.
首先,bootstrap类加载器加载所有rt.jar类.
所以我仍然感到困惑,因为Classloader也是一个类,所以谁将加载这个BootStrapClassloader.
请解释一下.
我想在这件事上提供一些帮助,
例:
public class A {
private void foo() {
//Who Invoked me
}
}
public class B extends A { }
public class C extends A { }
public class D {
C.foo();
}
Run Code Online (Sandbox Code Playgroud)
这基本上就是这种情况.我的问题是方法foo()怎么知道谁在调用它?
编辑:基本上我试图做一个数据库层,在类AI中将创建一个将生成SQL语句的方法.通过获取调用类的所有公共属性的值来动态生成此类语句.
到目前为止,我看到的自定义ClassLoader示例涉及子类化URLClassLoader,并使用该特定实例加载资源中的类.
我徒劳地试图寻找替换SystemClassLoader的替代方法,以便可以为不在类路径中的类查询我的ClassLoader.
我试过了Thread.currentThread().setContextClassLoader,但似乎没有用.
它甚至可能吗?
GlassFish允许创建N个域.每个域都有自己的Java类(库等)和系统设置.
例如,我们有两个域 - domain1和domain2.
通过GF Web控制台(http:// localhost:4848)为domain1设置了一个系统属性 - com.temp.foo=test1.除了通过GF web控制台(http:// localhost:7575),还为domain2设置了一个系统属性com.temp.foo=test2.
现在,在domain1中
System.out.println(System.getProperty("org.temp.foo"))
//returns `test1`
Run Code Online (Sandbox Code Playgroud)
在domain2中
System.out.println(System.getProperty("org.temp.foo"))
//returns `test2`
Run Code Online (Sandbox Code Playgroud)
据我所知,GF及其所有域都在JVM的一个实例中运行.我不明白在一个JVM独立系统属性的实例中它是如何可能的.谁能解释一下?
注意:我理解这可能是一个很长的解释,这就是为什么我只能按照我可以在互联网上阅读它们的顺序询问主要原则和解决方案/库名称.
在 Java 中,可以使用以下方法替换默认系统 ClassLoader:
java -Djava.system.class.loader=com.test.MyClassLoader xxx
Run Code Online (Sandbox Code Playgroud)
这样,自定义类加载器用于加载新类,同时将默认系统类加载器作为其父类。
可以使用非运行时方法在 Android 应用程序中完成相同的系统 ClassLoader 替换吗?(gradle/manifest 或其他一些编译标志)
我不想在运行时替换系统类加载器,而是在整个应用程序启动时为整个应用程序设置一个不同的系统类加载器,甚至在应用程序类加载之前。
最终目标是在<clinit>调用Application 类之前运行代码(这基本上允许我按照我认为合适的方式加载应用程序中的所有类)。