什么 Java 反射
Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
使用案例
package com.jack.tiger; import java.lang.reflect.*; /** * 使用反射技术操作方法所有细节 * * @author tiger * @Date 2017年8月3日 */ public class ReflectMethod { public static void main(String[] args) throws Exception { Cat cat = new Cat(); // 获取所有方法 getAllMethod(cat.getClass()); // 获取无参数的方法 System.out.println("====== 获取无参数的方法 ======"); Method m0 = getMethod(Cat.class, "eat"); m0.invoke(cat); System.out.println(); // 获取有参数的方法 System.out.println("====== 获取有参数的方法 ======"); Method m1 = getMethod(Cat.class, "eat", int.class, String.class); m1.invoke(cat, 10, "老鼠"); System.out.println(); // 无参,无返回值 System.out.println("====== 获取方法信息(无参),无返回值 ======"); getMethodInfo(m0); System.out.println(); // 有参,有返回值 System.out.println("====== 获取方法信息(有参),有返回值 ======"); getMethodInfo(m1); System.out.println(); System.out.println("====== 利用反射调用类构造器 ======"); getConstructor(); } /** * 1、获取所有方法 * * @param clazz */ public static void getAllMethod(Class clazz) { // 获取所有已经声明的方法,遍历出来 Method[] methods = clazz.getDeclaredMethods(); System.out.println("====== 遍历传入类的所有方法 ======"); for (Method method : methods) { System.out.println(method); } System.out.println("\n"); } /** * 2、获取指定方法,并执行此方法 invoke * * @param clazz 类 * @param mName 方法名称 * @param types 参数类型【按顺序填写】 * @return * @throws NoSuchMethodException * @throws Exception */ public static Method getMethod(Class clazz, String mName, Class... types) throws NoSuchMethodException, Exception { // 传入方法名和类型参数[类型.class](有多少传多少) Method m = clazz.getDeclaredMethod(mName, types); // 公开权限,以可以操作执行所有方法 m.setAccessible(true); return m; } /** * 获取指定方法中细节信息 * 1、获取类型参数 * 2、返回值 * 3、权限修饰符 1:公有 2:私有 4:protected 0:默认default * * @param m */ public static void getMethodInfo(Method m) { //1、获取类型参数 Class[] types = m.getParameterTypes(); System.out.println("此方法的参数列表"); for (Class c : types) { System.out.println(c); } //2、返回值 Class ret = m.getReturnType(); System.out.println("此方法返回值:" + ret); //3、权限修饰符 int mod = m.getModifiers(); System.out.println("权限修饰符:" + mod); } /** * 4、利用反射调用类构造器 * * @throws Exception */ public static void getConstructor() throws Exception { System.out.println("--获取所有构造器--"); Constructor[] cons = Cat.class.getDeclaredConstructors(); for (Constructor c : cons) { System.out.println(c); } System.out.println("--调用了无参构造器--"); Constructor c = Cat.class.getDeclaredConstructor(); Object object = c.newInstance(); System.out.println(object); System.out.println("--调用了有参构造器--"); Constructor c2 = Cat.class.getDeclaredConstructor(String.class); Object object2 = c2.newInstance("tiger"); System.out.println(object2); } } class Cat { protected String name = "老猫"; public int age = 12; private Integer score = 100; public Cat() { System.out.println("我是无参" + name); } public Cat(String name) { this.name = name; System.out.println("我是有参" + name); } public int eat(int a, String b) { System.out.println("调用有参方法:" + name + "吃了" + a + "只" + b); return a; } void eat() { System.out.println("调用无参方法:" + name + "没东西吃了"); } private int sleep() { System.out.println("Cat.sleep()"); return 0; } @Override public String toString() { return "Cat [name=" + name + ", age=" + age + ", score=" + score + "]"; } }