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

什么 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 + "]";
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljt-tiger

thanks

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值