使用反射技术操作方法所有细节

来源:互联网 发布:unity3d什么语言最好 编辑:程序博客网 时间:2024/05/20 05:09

1、使用反射技术操作方法所有细节

2、代码演示如下:

package com.reflect.api.method;import java.lang.reflect.*;import com.reflect.bean.Cat;/** * 使用反射技术操作方法所有细节 * @author tiger * @Date 2017年8月3日 */public class ReflectMethod {public static void main(String[] args) throws Exception, Exception  {System.out.println("--------------1、获取所有方法------------");getMethod(Cat.class);System.out.println("-------2、获取指定方法,并执行此方法 invoke-------");Cat cat = new Cat();//有参Method m = callMethod(Cat.class, "eat",int.class,String.class);m.invoke(cat, 10,"老鼠");//无参Method m2 = callMethod(Cat.class, "eat");m2.invoke(cat);System.out.println("--------------3、获取指定方法中细节信息---------");//有参,有返回值getMethodInfo(m);//无参,无返回值getMethodInfo(m2);System.out.println("--------------4、利用反射调用类构造器------------");getConstructor();}/** * 1、获取所有方法 * @param clzz */public static void getMethod(Class clzz){//获取所有已经声明的方法,遍历出来Method[]  methods = clzz.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}}/** * 2、获取指定方法,并执行此方法 invoke * @param clzz * @param name * @throws Exception  * @throws NoSuchMethodException  */public static Method callMethod(Class clzz,String mName,Class...types) throws NoSuchMethodException, Exception{//传入方法名和类型参数[类型.class](有多少传多少)Method  m = clzz.getDeclaredMethod(mName,types);//公开权限,以可以操作执行所有方法m.setAccessible(true);System.out.println(m);return m;}/** * 3、获取指定方法中细节信息 * 1、获取类型参数 * 2、返回值 * 3、权限修饰符 1:公有 2:私有 4:protected 0:默认default * @param m */public static void getMethodInfo(Method m){//1、获取类型参数Class[] types = m.getParameterTypes();System.out.print("此方法的参数列表:");for (Class c : types) {System.out.print(c+",");}System.out.println();//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);}}package com.reflect.bean;public 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;}@Overridepublic String toString() {return "Cat [name=" + name + ", age=" + age + ", score=" + score + "]";}}