以下是实现单例的两种方法.各有哪些优缺点?
静态初始化:
class Singleton {
private Singleton instance;
static {
instance = new Singleton();
}
public Singleton getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
延迟初始化是:
class Singleton {
private Singleton instance;
public Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道为什么Object,String等在最后有静态{}块.在Object Class中使用静态块是什么.
打开cmd提示符并键入
javap java.lang.Object
Run Code Online (Sandbox Code Playgroud)
As per java doc, static block is executed when the class is initialized.
Could anyone please tell me why static block is not executed when I run below code?
class A {
static {
System.out.println("Static Block");
}
}
public class Main {
public static void example1() {
Class<?> class1 = A.class;
System.out.println(class1);
}
public static void example2() {
try {
Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A");
System.out.println(class1);
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
example1();
}
}
Run Code Online (Sandbox Code Playgroud) 我想用静态块链接到一个类别category id.有什么想法吗?
我做了通常的搜索,但无济于事.
目前我可以做类似的事情<a href="{{store url="category-i-want.html"}}">,但这不是很强大.
如果我创建一个静态块并在那里创建一个Object,比如说其他一些类,那么该对象是在堆上还是在堆栈上创建的?
class Hello {
static {
Abc abcObject=new Abc();
}
// Other Code...
}
Run Code Online (Sandbox Code Playgroud) 考虑以下场景:
代码:1
public class StaticDemo {
static{
b=5;
System.out.println("Static B:"+b);/*Compilation error:"Cannot reference a field before it is defined"*/
}
static int b;
static{
System.out.println("B:"+b);
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
注释下面的代码,没有错误,并且显示了以下输出.
代码:2
public class StaticDemo {
static{
b=5;
//System.out.println("Static B:"+b);
}
static int b;
static{
System.out.println("B:"+b);
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
输出 -
B:5
Run Code Online (Sandbox Code Playgroud)
如果执行基于静态变量或块的写入顺序.
为什么初始化(b=5)没有抛出编译错误,如代码所示:2.
并且还请解释为什么Code:1抛出错误,如果Code:2为真?
我有这个库,其中包含一些需要在之前运行的静态初始化代码main()。如果您只将所有翻译单元一起编译,那么一切都很好,但是如果我提供一个静态库(.a文件)并让用户将其应用程序链接到它,则它不起作用-链接器只是忽略了进行我的静态初始化的符号。
或者,如果我为GCC指定选项,即为GNU链接指定选项,则可以使链接程序在静态库中接收所有内容。-Wl,--whole-archive--whole-archive
但是有中间立场吗?我可以标记一些符号并使链接器始终为可执行文件选择它们,而其余符号仅在需要时添加吗?
动机:我使用一些静态块在工厂中注册类。我想让我的代码可以作为(非动态)库使用,而用户代码不必为要填充的工厂执行任何“魔咒”。
一些相关的问题:
下面的函数破解了“HttpURLConnection#methods”静态字段(通过 Java 反射)。我正在使用反射来对我的代码功能进行单元测试。我发现我们无法更改 JDK12 中的静态最终字段。我找到了一种使用 unsafe 的解决方案,但我不确定如何使用 unsafe 让此函数在 JDK12 中工作。
protected static void allowMethods(String... methods) {
try {
Field methodsField = HttpURLConnection.class.getDeclaredField("methods");
Field modifiersField = Unsafe.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL);
methodsField.setAccessible(true);
String[] oldMethods = (String[]) methodsField.get(null);
Set<String> methodsSet = new LinkedHashSet<>(Arrays.asList(oldMethods));
methodsSet.addAll(Arrays.asList(methods));
String[] newMethods = methodsSet.toArray(new String[0]);
methodsField.set(null/*static field*/, newMethods);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
这是上述代码的堆栈跟踪:
Caused by: java.lang.IllegalStateException: java.lang.NoSuchFieldException: modifiers
at pii.rest.call.RestUtils.allowMethods(RestUtils.java:75)
at pii.rest.call.JobAbort.<clinit>(JobAbort.java:39)
Caused by: java.lang.NoSuchFieldException: modifiers
at java.base/java.lang.Class.getDeclaredField(Class.java:2549) …Run Code Online (Sandbox Code Playgroud) 尝试使用java时,我发现了一个非常有趣的事情.请找到以下代码:
public class SimpleTest {
static{
System.out.println(Thread.currentThread().getName());
System.exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的程序没有任何异常地运行(好吧,因为我正在静态块中退出).但我得到以下输出:
主要
由于我还没有启动主线程,它是如何创建的.根据我的理解,静态块在加载时执行.然后主线如何进入图片?
任何人都可以简要介绍如何在jvm中完成编译,加载和执行?还使用rt.jar?
先谢谢,Brinal
儿童班:
public class ChildExtending extends ParentAbstract{
public int childInt =111213;
static{
System.out.println("child static block executed");
}
public ChildExtending() {
System.out.println("child const initialized");
}
public void MethodInChild(){
System.out.println("MethodInChild called");
}
public static void main(String[] args){
System.out.println(ParentAbstract.parentInt);
System.out.println(ChildExtending.parentInt);
}
}
Run Code Online (Sandbox Code Playgroud)
抽象类:
public abstract class ParentAbstract {
public static int parentInt=80713;
static{
System.out.println("parent static executed");
parentInt=9;
}
public ParentAbstract(){
System.out.println("parentAbstract initialized");
}
public void MethodInParent(){
System.out.println("MethodInParent called");
}
}
Run Code Online (Sandbox Code Playgroud)
主要课程:
public class MainForCheck {
public static void main(String[] args){
/* ParentAbstract pa = …Run Code Online (Sandbox Code Playgroud) static-block ×10
java ×8
static ×2
c++ ×1
categories ×1
classloading ×1
heap ×1
jvm ×1
ld ×1
linker ×1
magento ×1
object ×1
reflection ×1
scope ×1
singleton ×1
stack ×1
unit-testing ×1