Java反射常用于哪里,Java反射常用到的几个方法,获取Private字段,执行其他类的方法,获取类名...

1.引言

已经很久没有写过Java代码了,写了一年的的C++,今天看到C++的friend(友元)可以操作一个类的private属性,突然想到Java的反射,今天用Java写了一小段代码实验了一下,项目中比较实用。也是在以前做安卓的项目的时候老是听到师傅说反射,没怎么用过,终于尝试了一下。

2.代码片段

Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

下面来看看我的代码片段:

package cn.reflect.demo;

/**

* 描述:实验Java的反射机制(部分)

* 作者:某种意境丶

* */

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Reflect {

public static void main(String[] args) {

/** 1. 通过反射来调用一个类的方法 */

Class> data = null;

try {

data = Class.forName("cn.reflect.demo.Data");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

try {

// 调用Data类的print方法

Method method = data.getMethod("print");

System.out.print("通过反射来调用一个类的方法:");

// invoke的洋文意思就是 调用

method.invoke(data.newInstance());

} catch (Exception e) {

e.printStackTrace();

}

/** 2. 查看类名 */

Data newData = new Data();

System.out.print("完整的包名+类名:");

System.out.println(newData.getClass().getName());

/** 3. 通过反射来获取一个类的private字段 */

Object obj = null;

try {

obj = data.newInstance();

Field field = data.getDeclaredField("cnName");

// 这里设置访问权限为true

field.setAccessible(true);

// 为字段设置新内容

//field.set(obj, "某种意境丶");

String privateField = (String) field.get(obj);

System.out.print("获得的Private字段的值是:");

System.out.println(privateField);

} catch (Exception e) {

e.printStackTrace();

}

}

}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

551

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

查看打印:

90019511_1

在访问私有属性的时候,field.setAccessible(true)的设置是很关键的,它把权限设置为true,从而让对象能够操作那个类的私有字段,类似get/set操作。

public void setAccessible(boolean flag) throws SecurityException {

SecurityManager sm = System.getSecurityManager();

if (sm != null) sm.checkPermission(ACCESS_PERMISSION);

setAccessible0(this, flag);

}1

2

3

4

51

2

3

4

5

这是setAccessible的Java源码,可以看到有一个SecurityManager类来管理这些权限,具体的可以自己再查看Java源码怎么实现,这对自己的code能力也是很有帮助的。

如果不知道怎么查看Java源码,可以参考这篇文章:http://blog.csdn.net/dinghqalex/article/details/43764607

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值