Collection’modifiers seem not correct when reflect

本文通过分析Java中接口Collection的修饰符,揭示了接口及其方法默认为公共抽象的特性,并探讨了反射API如何呈现这些信息。
做练习的时候就抄了如下方法

public static void printModifiers(final Class<?> dataType){
final int mod=dataType.getModifiers(); //1537 if dataType is Collection.class,
//1537=1024+513=2^10+2^8+1
if(Modifier.isPrivate(mod)) //one class may have more modifiers
U.p("private "); //U.p() is similar to System.out.print()
if(Modifier.isProtected(mod))
U.p("protedted ");
if(Modifier.isPublic(mod))
U.p("public ");
if(Modifier.isAbstract(mod))
U.p("abstract ");
if(Modifier.isFinal(mod))
U.p("final ");
if(Modifier.isNative(mod))
U.p("native ");
if(Modifier.isInterface(mod))
U.p("interface ");
if(Modifier.isStatic(mod))
U.p("static ");
if(Modifier.isStrict(mod))
U.p("strict ");
if(Modifier.isSynchronized(mod))
U.p("synchronized ");
if(Modifier.isTransient(mod))
U.p("transient ");
if(Modifier.isVolatile(mod))
U.p("volatile ");
U.pl(dataType.getName());//U.pl() is similar to System.out.println()
}
public static void main(String[] args){
printModifiers(Collection.class);
}

控制台输出:
public [b]abstract[/b] interface java.util.Collection

看着有点别扭,嗯?怎么多了个abstract?bug?jdk bug?
断点调试、查看源代码

import java.util.Collection; //导入的没错
public interface Collection<E> extends Iterable<E> //接口声明
public interface Iterable<T> //没有继承任何接口
public native int getModifiers(); //Class<T>中的本地方法
public final class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement ;
public static boolean isAbstract(int mod) { //Modifier中的静态方法实现
return (mod & ABSTRACT) != 0;
}
public static final int ABSTRACT = 0x00000400; //1024=2^10=4^5=4*16^2
//1537&1024=1024

还在怀疑public native int getModifiers()这个本地方法出错了。
上帝这么容易让我找到了jdk5的bug。
反问自己:Collection是abstract的吗?它有abstract方法吗? 恍然大悟,只要有方法都是抽象方法。有点埋怨,java作为一门严格的语言,那么在声明接口的时候也应该强制PG加上abstract,干嘛还来个隐式的?那么反射的时候又干嘛给加上?

小学的时候,考了100分,以为自己长大了能当个伟大的科学家。
Java反射中,`Modifier`类用于描述类、方法或字段的修饰符信息。通过反射获取字段的修饰符,可以用于判断字段的访问权限或其他特性,例如是否是`public`、`private`、`static`等。 以下是一个使用Java反射获取字段修饰符的示例: ```java import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class ModifierExample { private int privateField; public static final String PUBLIC_STATIC_FIELD = "public static final field"; public static void main(String[] args) { try { // 获取类的字段 Field field = ModifierExample.class.getDeclaredField("privateField"); // 获取字段的修饰符 int modifiers = field.getModifiers(); // 判断修饰符的具体类型 if (Modifier.isPrivate(modifiers)) { System.out.println("privateField 是 private 修饰的"); } if (Modifier.isStatic(modifiers)) { System.out.println("privateField 是 static 修饰的"); } if (Modifier.isFinal(modifiers)) { System.out.println("privateField 是 final 修饰的"); } } catch (NoSuchFieldException e) { e.printStackTrace(); } } } ``` ### 示例说明 1. **获取字段**:通过`ModifierExample.class.getDeclaredField("privateField")`获取指定字段。 2. **获取修饰符**:通过`field.getModifiers()`返回一个整数,表示字段的所有修饰符。 3. **判断修饰符**:使用`Modifier`类的静态方法(如`isPrivate`、`isStatic`、`isFinal`)来判断字段的修饰符类型。 ### 常见修饰符常量 - `Modifier.PRIVATE`:表示`private`修饰符。 - `Modifier.PROTECTED`:表示`protected`修饰符。 - `Modifier.PUBLIC`:表示`public`修饰符。 - `Modifier.STATIC`:表示`static`修饰符。 - `Modifier.FINAL`:表示`final`修饰符。 - `Modifier.VOLATILE`:表示`volatile`修饰符。 - `Modifier.TRANSIENT`:表示`transient`修饰符。 通过这些方法和常量,可以对反射获取的字段进行详细的修饰符分析。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值