java 反射
在Java中,我们能通过反射知道类的所有成员变量和成员方法,调用所有类和成员方法。
例:entity.User
public class User { private String privateMsg = "I'm private"; public String publicMsg = "I'm public"; private static String staticMsg="I'm static"; private void privateMethod() { System.out.println("I'm privateMethod"); } public void publicMethod() { System.out.println("I'm publicMethod"); } private User() { } }
一、类类型(class type)的获取
下面是获取类类型的三种方法:
public static void main(String[] args) throws ClassNotFoundException { // 方法一 Class<? extends User> c1 = new User().getClass(); // 方法二 Class<User> c2 = User.class; // 方法三 Class<?> c3 = Class.forName("entity.User"); System.out.println(c1 == c2); // output: true System.out.println(c1 == c3); // output: true }
二、成员变量
1.所有成员变量的获取
getDeclaredFields()方法获取所有成员变量
getFields() 方法获取public成员变量
Class<?> cls = Class.forName("entity.User");
Field[] fields1 = cls.getDeclaredFields(); //获取所有成员变量
Field[] fields2 = cls.getFields(); //获取public成员变量
2.变量的操作
public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("entity.User"); User user = (User) cls.newInstance(); //获得User对象实例 Field field = cls.getDeclaredField("privateMsg"); field.setAccessible(true); System.out.println(field.get(user)); field.set(user, "I'm new"); //修改变量的值 System.out.println(field.get(user)); }
输出:
I'm private I'm new
三、成员方法
1.所有成员方法的获取
与成员变量的获取方式类似:
Class<?> cls = Class.forName("entity.User");
Method[] methods1 = cls.getDeclaredMethods(); //获取所有方法
Method[] methods2 = cls.getMethods(); //获取所有public方法
2.成员方法的操作
public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("entity.User"); User user = (User) cls.newInstance(); Method method=cls.getDeclaredMethod("privateMethod"); method.setAccessible(true); method.invoke(user); }
输出:
I'm privateMethod
四、构造方法
1.所有构造方法的获取
Constructor<?> constructors1 = cls.getDeclaredConstructor(); //获取所有构造方法
Constructor<?> constructors2 = cls.getConstructor(); //获取public构造方法
2.通过构造方法创造对象
public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("entity.User"); Constructor<?> constructor = cls.getDeclaredConstructor(); //获得构造方法 constructor.setAccessible(true); User user = (User) constructor.newInstance(); //获得对象实例 System.out.println(user.getClass().getName()); //输出: entity.User }
五、静态成员变量和静态方法
对静态变量、静态方法方法操作与非静态变量和方法类似,区别是对静态变量和方法进行操作时无需创建对象,对象用null替代即可,如:
public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("entity.User"); Field field = cls.getDeclaredField("staticMsg"); field.setAccessible(true); System.out.println(field.get(null)); field.set(null, "new"); System.out.println(field.get(null)); }
输出:
I'm static
new