Java针对类、成员变量、方法,有很多修饰符,例如public、private、static、final、synchronized、abstract等,这些修饰符用来控制访问权限或其他特性。在看Class、Field 等类源码时,看到他们都有这样一个方法:getModifiers():返回此类或接口以整数编码的 Java 语言修饰符。如需要知道返回的值所代表的意思,则需要用到 java.lang.reflect.Modifier 这个类,这个类提供了 static 方法和常量,可以对类和成员访问修饰符进行解码。

java.lang.Class类有一个方法:int getModifiers()

返回此类或接口以整数编码的 Java语言修饰符。这个方法就是返回一个int型的返回值,代表类、成员变量、方法的修饰符。

java.lang.reflect.Field类也有这个方法:int getModifiers()

以整数返回此{@code Field}对象表示的字段的Java语言修饰符。 {@code Modifier}类应用于解码修饰符。

这里演示一下基本的场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package com.java4all;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

/**
* @author IT云清
* @date 2020年02月15日 18:49:02
*
*/
@RunWith(MockitoJUnitRunner.class)
public class TestReflect {

private User user;
private Field ageField;

@Test
public void test() throws NoSuchFieldException, IllegalAccessException {
user = Mockito.mock(User.class);
System.out.println(user.getAge());//0

//那个age这个属性Field
ageField = User.class.getDeclaredField("age");
//获取这个Filed的modifiers整数表现形式
int modifiers = ageField.getModifiers();//10
//解码为字符串
System.out.println(Modifier.toString(modifiers));//private static final
//判断是否包含public修饰符
System.out.println(Modifier.isPublic(modifiers));//false
//判断是否包含private修饰符
System.out.println(Modifier.isPrivate(modifiers));//true



//设置属性的访问权限
ageField.setAccessible(true);
Field modifiers1 = Field.class.getDeclaredField("modifiers");
modifiers1.setAccessible(true);
//忽略final修饰符
modifiers1.setInt(ageField,ageField.getModifiers() & ~Modifier.FINAL);
System.out.println(Modifier.toString(ageField.getModifiers()));//private static
//忽略static修饰符
modifiers1.setInt(ageField,ageField.getModifiers() & ~Modifier.STATIC);
System.out.println(Modifier.toString(ageField.getModifiers()));//private

ageField.set(null,888);
System.out.println(ageField.get(null));
System.out.println(user.getAge());

}




}

class User {
private final static Integer age = 5;
private final Integer money = 500;
private final static Integer num = 100;
private String name = "IT云清";

public Integer getMoney(){
System.out.println("money="+money);
return money;
}
public Integer getNum(){
System.out.println("num="+num);
return num;
}

public Integer getAge(){
System.out.println("age="+age);
return age;
}

private String getName(){
System.out.println("name="+name);
return name;
}
}

最后更新: 2020年03月26日 17:33

原始链接: https://java4all.cn/2020/02/15/Java-Modifier/