什么是反射?
反射就是在程序运行状态中,对于任何一个类,都能通过特定的方式方法获取到这个类的属性和方法,并且可以对这些属性、方法进行调用。
说白了,反射就是在程序运行时获取和执行某个类属性或方法的功能。
反射具体能做些什么?
能做的事情主要分为以下几种。
我们默认先写好一个类:APP.java;
public class APP { private Integer id; private String username; public String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String toString(){ System.out.print("toString"); } private String toString_2(){ System.out.print("toString_2"); } }
获取类
Class.forName(param)方法
param:指定类的全路径,比如:com.test.APP,代码如下:
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class aClass = Class.forName("com.test.APP"); APP app = (APP) aClass.newInstance(); }
这里的newInstance():实例化Class,生成对象,等同于new。
调用公共属性(public)
getField(param):获取指定的公共属性,param:指定的属性名称。
getFields():获取全部的公共属性,返回值Field[]数组。
代码如下:
public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP"); // APP app = (APP) aClass.newInstance(); Field password = aClass.getField("password"); //打印结果:public java.lang.String com.test.APP.password System.out.println(password); Field[] fields = aClass.getFields(); }catch (Exception e){ e.printStackTrace(); } }
调用私有属性
getDeclaredField(param):获取指定的私有属性,param:指定的属性名称。
getDeclaredFields():获取全部的私有属性。
代码如下:
public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP"); Field username = aClass.getDeclaredField("username"); // 强制获得私有变量的访问权限 username.setAccessible(true); //打印结果:public java.lang.String com.test.APP.username System.out.println(username); Field[] fields = aClass.getDeclaredFields(); }catch (Exception e){ e.printStackTrace(); } }
这里还涉及到一个方法,就是setAccessible(true),其作用是获得访问权限,否则无法获取这个属性。
调用公共方法 (public)
getMethod(param):获取指定的公共方法,param:指定的方法名称
getMethods():获取全部公共方法
public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP"); Method method = aClass.getMethod("toString"); Method[] methods = aClass.getMethods(); //执行toString()方法 Object app = aClass.newInstance(); method.invoke(app); }catch (Exception e){ e.printStackTrace(); } }
这里还有一个知识点,就是如何执行获取到Method方法,在代码中也有体现,可以自行尝试一下。
调用私有方法
getDeclaredMethod(param):获取指定的私有方法,param:指定的私有方法名称。
getDeclaredMethods():获取全部的私有方法。
public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP"); Method method = aClass.getDeclaredMethod("toString_2"); method.setAccessible(true); Method[] methods = aClass.getDeclaredMethods(); //执行toString()方法 Object app = aClass.newInstance(); method.invoke(app); }catch (Exception e){ e.printStackTrace(); } }