当前位置:首页 > java > 正文

java有趣的源代码

  • java
  • 2024-04-19 07:42:07
  • 6324

Java 语言以其清晰、简洁和健壮而闻名,但它也有一些鲜为人知的有趣源代码片断。 以下是其中的一些:
1. 神奇的方法 toString()
toString() 方法是每个 Java 对象继承自 Object 类的通用方法。 它通常用于将对象转换为其字符串表示形式。 然而,它也有一些有趣的功能:
java
System.out.println(new Object().toString()); // 输出 "java.lang.Object@hashcode"
输出中包含对象的类名和哈希码。 这对于调试和了解对象的标识非常有用。
2. 反射中的 setAccessible(true)
反射允许程序在运行时检查和修改类的结构。 setAccessible(true) 方法允许访问通常不可访问的字段和方法:
java
Field privateField = obj.getClass().getDeclaredField("secretField");
privateField.setAccessible(true); // 允许访问私有字段
此代码允许修改通常无法访问的私有字段,这在某些情况下可能是非常有用的。
3. 泛型的擦除
Java 中的泛型在编译时被擦除,这意味着它们不会在运行时存在。 这会导致一些有趣的情况:
java
List stringList = new ArrayList<>();
List intList = new ArrayList<>();
虽然编译器知道 stringList 和 intList 是不同类型的列表,但 JVM 不知道。 因此,以下代码编译通过:
java
stringList.addAll(intList);
4. new 关键字的奇怪用法
new 关键字通常用于创建新对象的实例。 但是,它也可以用于创建匿名类的实例:
java
Runnable runnable = new Runnable() {
@Override
public void run() {
// 匿名类的代码
}
};
这实际上创建了一个内部类,实现了 Runnable 接口。
5. assert 关键字的巧妙用法
assert 关键字在 Java 中用于断言条件是否为真。 它有一个鲜为人知的功能:
java
assert false : "Error message";
如果断言失败,它将抛出 AssertionError 异常并打印错误消息。 这提供了一种在调试时提供更有意义的错误消息的便捷方式。
6. 类加载器中的 getResource()
getResource() 方法用于从类路径中加载资源。 它有一个有趣的用法:
java
URL url = getClass().getResource("/"); // 获取当前类的根目录
这提供了访问应用程序部署目录中文件的一种简单方法。
7. System.out 和 System.err
System.out 和 System.err 用于打印输出到标准输出和标准错误流。 然而,它们有一个鲜为人知的功能:
java
System.out.flush(); // 立即刷新输出
System.err.println("Error message", new RuntimeException("Cause")); // 打印异常堆栈
flush() 方法迫使输出立即被写入流,而 println() 方法允许打印异常堆栈,这对于调试非常有用。