java 中如何获取字节码文件的相关内容

2025-05-29 0 92

java 中如何获取字节码文件的相关内容

反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法;对任意一个对象,都能调用这个对象的方法和属性。这种动态的获取信息和动态的调用对象的方法的功能称为——Java语言的反射机制。

简单点说,动态的获取类中的信息,这就是Java的反射机制。

Java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数、成员变量和成员函数等。在接下来,作者将分别演示如何通过类名来获取类中包含的信息。

一、获取字节码文件的构造函数

?

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
import java.lang.reflect.Constructor;

public class GetClassConstructor {

public static void main(String[] args) throws Exception {

createNewObject_2();

}

public static void createNewObject_2() throws Exception {

/**

* 当获取指定名称对应类中的所体现的对象时,而且该对象的初始化不适用空参的构造函数

* 可以先通过该类的字节码文件对象,获取空参的构造函数

* 该方法为:getConstructor(parameterTypes)

*/

// 包名一定要写全,否则会报"java.lang.ClassNotFoundException"异常

String name = "src.Person";

// 找寻该名称类文件,并加进内存,产生Class对象

Class clazz = Class.forName(name);

// 获取指定的构造函数对象

Constructor constructor = clazz.getConstructor(String.class, int.class);

// 通过该构造器对象的newInstance进行对象的初始化

constructor.newInstance("小明", 12);

}

public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

String name = "src.Person";

// 找寻该名称类文件,并加进内存,产生Class对象

Class clazz = Class.forName(name);

// 产生该类的实例对象(空参)

Object obj = clazz.newInstance();

}

}

二、获取字节码文件的成员变量

?

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
import java.lang.reflect.Field;

public class GetClassField {

public static void main(String[] args) throws Exception {

getField();

}

/**

* 获取字节码文件中的成员变量

*/

public static void getField() throws Exception {

Class clazz = Class.forName("src.Person");

Field field = null;

// 获取本类字段,包含私有

field = clazz.getDeclaredField("age");

// 对私有字段的访问取消权限检查,可称之为暴力访问

field.setAccessible(true);

Object obj = clazz.newInstance();

field.set(obj, Integer.valueOf(89));

Object o = field.get(obj);

System.out.println(o);

}

}

三、获取字节码文件的成员函数

?

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
import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

public class GetClassMethod {

public static void main(String[] args) throws Exception {

getMethod_3();

}

public static void getMethod_3() throws Exception {

Class clazz = Class.forName("src.Person");

Method method = clazz.getMethod("walkInfo", new Class[]{String.class, Integer.TYPE});

Object obj = clazz.newInstance();

method.invoke(obj, new Object[]{"小强", Integer.valueOf(20)});

}

public static void getMethod_2() throws Exception {

Class clazz = Class.forName("src.Person");

// 获取空参数的方法

Method method = clazz.getMethod("show", (Class[]) null);

Constructor constructor = clazz.getConstructor(new Class[]{String.class, Integer.TYPE});

Object obj = constructor.newInstance(new Object[]{"小明", Integer.valueOf(12)});

method.invoke(obj, (Object[]) null);

}

/**

* 获取指定Class中的公有函数

*/

public static void getMethod() throws Exception {

Class clazz = Class.forName("src.Person");

// 获取的都是类中的公有方法

Method[] methods = clazz.getMethods();

// 获取本类中的所有方法

methods = clazz.getDeclaredMethods();

Method[] var5 = methods;

int var4 = methods.length;

for (int var3 = 0; var3 < var4; ++var3) {

Method method = var5[var3];

System.out.println(method);

}

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/qq_35246620/article/details/53584524

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java 中如何获取字节码文件的相关内容 https://www.kuaiidc.com/117422.html

相关文章

发表评论
暂无评论