From 1df6ae6ea89942758f91c024c541f58417d4a8a1 Mon Sep 17 00:00:00 2001 From: App <2314785400@qq.com> Date: Thu, 30 Apr 2026 09:27:33 +0800 Subject: [PATCH] w8 --- w8/AI.txt | 100 +++++++++++++++++++++++++ w8/Cache.java | 155 +++++++++++++++++++++++++++++++++++++++ w8/CacheTest.java | 27 +++++++ w8/Pair.java | 67 +++++++++++++++++ w8/PairTest.java | 20 +++++ w8/QQ20260430-092036.png | Bin 0 -> 7266 bytes w8/QQ20260430-092544.png | Bin 0 -> 8965 bytes 7 files changed, 369 insertions(+) create mode 100644 w8/AI.txt create mode 100644 w8/Cache.java create mode 100644 w8/CacheTest.java create mode 100644 w8/Pair.java create mode 100644 w8/PairTest.java create mode 100644 w8/QQ20260430-092036.png create mode 100644 w8/QQ20260430-092544.png diff --git a/w8/AI.txt b/w8/AI.txt new file mode 100644 index 0000000..14c8dca --- /dev/null +++ b/w8/AI.txt @@ -0,0 +1,100 @@ +问题:Java泛型擦除后如何通过反射获取泛型信息? +答:虽然 Java 在编译时会进行类型擦除(Type Erasure),将泛型替换为原始类型(通常是 Object 或边界类型),但某些情况下泛型信息会被保留在字节码中,可以通过反射获取: + +1. 获取父类/接口的泛型参数 +Java +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.List; + +// 继承泛型类时指定具体类型 +public class StringList extends ArrayList {} + +public class GenericReflectionDemo { + public static void main(String[] args) { + // 获取父类的泛型参数 + Class clazz = StringList.class; + Type genericSuperclass = clazz.getGenericSuperclass(); + + if (genericSuperclass instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) genericSuperclass; + Type[] actualTypeArgs = pt.getActualTypeArguments(); + for (Type type : actualTypeArgs) { + System.out.println("泛型参数类型: " + type); + // 输出: class java.lang.String + } + } + } +} +2. 获取字段的泛型类型 +Java +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +public class GenericField { + private List names; + private Map mapping; +} + +// 获取字段泛型 +Field field = GenericField.class.getDeclaredField("names"); +Type genericType = field.getGenericType(); +if (genericType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) genericType; + System.out.println("字段泛型参数: " + + Arrays.toString(pt.getActualTypeArguments())); + // 输出: [class java.lang.String] +} +3. 获取方法参数的泛型类型 +Java +1 +2 +3 +4 +public void process(List items, Map map) {} + +Method method = clazz.getMethod("process", List.class, Map.class); +Type[] paramTypes = method.getGenericParameterTypes(); +4. 核心 API 总结 +反射方法 用途 +getGenericSuperclass() 获取父类的泛型类型 +getGenericInterfaces() 获取接口的泛型类型 +Field.getGenericType() 获取字段的泛型类型 +Method.getGenericReturnType() 获取返回值的泛型类型 +Method.getGenericParameterTypes() 获取方法参数的泛型类型 +ParameterizedType.getActualTypeArguments() 获取实际泛型参数 +⚠️ 限制:局部变量和方法参数的泛型信息在运行时是完全擦除的,无法通过反射获取。 diff --git a/w8/Cache.java b/w8/Cache.java new file mode 100644 index 0000000..330a2c7 --- /dev/null +++ b/w8/Cache.java @@ -0,0 +1,155 @@ +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import java.util.Collection; +import java.util.Optional; +import java.util.HashSet; +import java.util.ArrayList; + +/** + * 泛型缓存类 Cache + * 提供简单的键值缓存机制(非线程安全) + * @param 键的类型 + * @param 值的类型 + */ +public class Cache { + private final Map cache; + private final int maxSize; + + // 统计信息 + private long hitCount = 0; + private long missCount = 0; + + /** + * 默认构造方法 - 无容量限制 + */ + public Cache() { + this(Integer.MAX_VALUE); + } + + /** + * 带容量限制的构造方法 + */ + public Cache(int maxSize) { + this.maxSize = maxSize; + this.cache = new HashMap<>(); + } + + /** + * 存入缓存 + */ + public void put(K key, V value) { + if (key == null) { + throw new IllegalArgumentException("Key cannot be null"); + } + if (cache.size() >= maxSize && !cache.containsKey(key)) { + throw new IllegalStateException("Cache is full, no eviction strategy implemented"); + } + cache.put(key, value); + } + + /** + * 从缓存获取 + */ + public V get(K key) { + if (cache.containsKey(key)) { + hitCount++; + return cache.get(key); + } else { + missCount++; + return null; + } + } + + /** + * 使用 Optional 包装返回值(更安全的API) + */ + public Optional getOptional(K key) { + return Optional.ofNullable(get(key)); + } + + /** + * 判断缓存中是否存在键 + */ + public boolean containsKey(K key) { + return cache.containsKey(key); + } + + /** + * 从缓存中移除 + */ + public V remove(K key) { + return cache.remove(key); + } + + /** + * 清空缓存 + */ + public void clear() { + cache.clear(); + hitCount = 0; + missCount = 0; + } + + /** + * 获取缓存大小 + */ + public int size() { + return cache.size(); + } + + /** + * 判断缓存是否为空 + */ + public boolean isEmpty() { + return cache.isEmpty(); + } + + /** + * 获取所有键 + */ + public Set keySet() { + return new HashSet<>(cache.keySet()); + } + + /** + * 获取所有值 + */ + public Collection values() { + return new ArrayList<>(cache.values()); + } + + /** + * 获取命中率 + */ + public double getHitRate() { + long total = hitCount + missCount; + return total == 0 ? 0.0 : (double) hitCount / total; + } + + /** + * 获取统计信息 + */ + public CacheStats getStats() { + return new CacheStats(hitCount, missCount, getHitRate()); + } + + // 统计信息内部类 + public static class CacheStats { + public final long hits; + public final long misses; + public final double hitRate; + + public CacheStats(long hits, long misses, double hitRate) { + this.hits = hits; + this.misses = misses; + this.hitRate = hitRate; + } + + @Override + public String toString() { + return String.format("CacheStats{hits=%d, misses=%d, hitRate=%.2f%%}", + hits, misses, hitRate * 100); + } + } +} \ No newline at end of file diff --git a/w8/CacheTest.java b/w8/CacheTest.java new file mode 100644 index 0000000..8b04cd2 --- /dev/null +++ b/w8/CacheTest.java @@ -0,0 +1,27 @@ +public class CacheTest { + public static void main(String[] args) { + // 创建缓存实例 + Cache ageCache = new Cache<>(100); + + // 存入数据 + ageCache.put("Alice", 25); + ageCache.put("Bob", 30); + ageCache.put("Charlie", 35); + + // 获取数据 + System.out.println("Alice's age: " + ageCache.get("Alice")); + + // 测试缓存未命中 + Integer davidAge = ageCache.get("David"); + System.out.println("David's age: " + davidAge); + + // 查看统计信息 + System.out.println(ageCache.getStats()); + + // 使用 Optional API + ageCache.getOptional("Eve").ifPresentOrElse( + age -> System.out.println("Found: " + age), + () -> System.out.println("Eve not found") + ); + } +} diff --git a/w8/Pair.java b/w8/Pair.java new file mode 100644 index 0000000..e1249fd --- /dev/null +++ b/w8/Pair.java @@ -0,0 +1,67 @@ +/** + * 泛型 Pair 类 - 用于存储键值对 + * @param 键的类型 + * @param 值的类型 + */ +public class Pair { + private K key; + private V value; + + // 构造方法 + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + // Getter 方法 + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + // Setter 方法 + public void setKey(K key) { + this.key = key; + } + + public void setValue(V value) { + this.value = value; + } + + /** + * swap 方法 - 交换当前 Pair 的 key 和 value + * 注意:只有当 K 和 V 类型相同时才能交换,否则返回新 Pair + */ + public Pair swap() { + return new Pair<>(value, key); + } + + /** + * 静态泛型方法 - 交换任意两个 Pair 对象 + */ + public static Pair swap(Pair pair) { + return new Pair<>(pair.getValue(), pair.getKey()); + } + + @Override + public String toString() { + return "Pair{" + "key=" + key + ", value=" + value + '}'; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Pair pair = (Pair) obj; + return java.util.Objects.equals(key, pair.key) && + java.util.Objects.equals(value, pair.value); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(key, value); + } +} diff --git a/w8/PairTest.java b/w8/PairTest.java new file mode 100644 index 0000000..f81268b --- /dev/null +++ b/w8/PairTest.java @@ -0,0 +1,20 @@ +public class PairTest { + public static void main(String[] args) { + // 测试整数-字符串 Pair + Pair pair1 = new Pair<>(1, "One"); + System.out.println("原 Pair: " + pair1); + + // 使用实例方法 swap + Pair swapped = pair1.swap(); + System.out.println("交换后: " + swapped); + + // 使用静态方法 swap + Pair swapped2 = Pair.swap(pair1); + System.out.println("静态交换: " + swapped2); + + // 测试相同类型的 Pair 交换 + Pair pair2 = new Pair<>("A", "B"); + Pair swappedSame = pair2.swap(); + System.out.println("同类型交换: " + swappedSame); + } +} \ No newline at end of file diff --git a/w8/QQ20260430-092036.png b/w8/QQ20260430-092036.png new file mode 100644 index 0000000000000000000000000000000000000000..065e0bc99a28266dc9a030561c172153d62555f2 GIT binary patch literal 7266 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 literal 0 HcmV?d00001 diff --git a/w8/QQ20260430-092544.png b/w8/QQ20260430-092544.png new file mode 100644 index 0000000000000000000000000000000000000000..074e5a31acd8a2e914ad14211dd0b0da8196e3d1 GIT binary patch literal 8965 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 literal 0 HcmV?d00001