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
相关文章
猜你喜欢
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 55
-
2025-05-25 31
-
2025-05-25 62
-
如何实现企业服务器的自动化部署和配置管理?有哪些推荐的工具和技术?
2025-05-25 40 -
2025-05-27 44
热门评论

