反射,是指反向探知,逆向去学习与使用类内部细节的方法。在Java运行时,动态的去获取对象的信息,并调用其属性。
通过动态获取类的内容、动态调用对象的方法和属性的机制,就叫做Java的反射机制。
类对象、类信息的获取、类属性与方法的获取
类对象,即该对象指代了一个类,通过该对象可以获取其指代类的具体信息以及属性方法,如类名、包名、加载器、类中的方法等等。
一、获取类对象
以下是获取类对象的四种方式。
public class MainTest {
public static void main(String[] args) throws Exception {
Class<User> userClass = User.class;
Class<?> userClass = Class.forName("reflect.User"); // 括号里是包名.类名
Class<? extends User> userClass = new User().getClass();
Class<?> userClass = MainTest.class.getClassLoader().loadClass("reflect.User");
}
}
二、通过类对象获取类信息
Class<User> userClass = User.class; // 类对象
// 获取类名 reflect.User
userClass.getName();
// 获取包名 package reflect
userClass.getPackage();
// 类加载器 sun.misc.Launcher$AppClassLoader@18b4aac2
userClass.getClassLoader();
// 父类 class java.lang.Object
userClass.getSuperclass();
// 获取类实现的所有接口
userClass.getInterfaces();
类的修饰符,指类前面的修饰词,public
, private
, final
, abstract
等就是修饰符,每个修饰符在二进制中占一位。public是1,private是0;abstract是1024…
getModifiers()
获取类的修饰符,类前面修饰符的总和。
// 类的修饰符
userClass.getModifiers();
三、获取类中的属性、修改属性值
-
获取类的属性
getFields()
获取类以及其父类里的 public 属性getDeclaredFields()
获取当前类的所有属性public class Person { public String firstVar; private int secondVar; public static double thirdVar; } public class User extends Person{ public String name; private int age; public static String address; public void method1 () { System.out.println