这是我参与更文挑战的第29天,活动详情查看: 更文挑战
概述:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射机制
什么是反射:
在我们了解Java反射之前先思考什么是正射,即程序正常运行的过程。
- 正射:程序在编译之前就已经被Java虚拟机加载,加载完了所有需要的类。
- 反射:在编译时并不知道哪个类被加载,在运行时才加载、调用。
总结下来什么是反射机制:反射就是把java类中的各种成分映射成一个个的Java对象,在程序运行时,才会动态获取类的完整结构信息以及调用对应方法的功能。 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
Java反射常用的类
- Class类:反射的核心类,所有操作都是围绕该类来生成的,通过Class类可以获取类的属性、方法。
- Field类:表示类的属性。
- Method类:表示类的方法。
- Constructor类:表示类的构造方法。
反射的应用
一个对象:
@Data
public class User {
private String name;
public int age;
private char gender;
通过反射获取Class对象
User p = new User();
Class c = p.getClass();
//注:getClass()是Object类中的一个方法,该方法可以返回该对象所属类对应的Class对象。
调用类的class属性
Class c = User.class;
//注:调用类的class属性可以获取该类对应的Class对象,但是要在编译期间就知道类的名称。
使用Class类的forName静态方法
Class c = Class.forName("entity.User");
//注:Class类的forName()方法也可以获取对应的Class对象,该方法需要传入字符串参数,该字符串参数的值是类的全名,要在类名前加完整的包名。
创建对象(任意一种都行)
1、Class c = User.class;
2、User p = (User)c.newInstance();
3、Constructor t = c.getConstructor(String.class,int.class,char.class);
User p = (User) t.newInstance("张三",18,'男');
访问Class对应类所包含的属性
Class c = User.class;
Field[] fields = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].getName());
System.out.println(Modifier.toString(fields[i].getModifiers()));
}
Field field = c.getDeclaredField("name");
field.setAccessible(true);
User p = new User();
field.set(p,"张三");
System.out.println(p.toString());
访问Class对应类所包含的非构造方法
User user = new User();
Class t = user.getClass();
Method[] methods = t.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(Modifier.toString(methods[i].getModifiers()));
System.out.println(methods[i].getName());
Class[] parameterTypes = methods[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
System.out.println(parameterTypes[j].getName());
}
System.out.println();
}
Method method = t.getDeclaredMethod("welcome", String.class);
System.out.println(Modifier.toString(method.getModifiers()));
method.setAccessible(true);
method.invoke(user,"111");
ok!今天的文章就到这了,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;
整洁成就卓越代码,细节之中只有天地