学习笔记 java.lang.reflect.Proxy简单使用

使用流程

创建一个类继承接口InvocationHandler 并重写其中的public Object invoke(Object proxy, Method method, Object[] args) 因为方法里面要调用  你需要增强的代码  是用反射里面的invoke 所以需要传递一个对象  所以我们可以在构造这个类的时候顺便传进来

具体代码如下

    /**
     *
     * @param method  为需要增强的方法
     * @param args 为要增强方法的需要的参数
     * @return 返回的类型必须是增强方法的返回值类型 否则会有报错 例如
     * Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot 
         be cast to [Ljava.lang.String;
     *     at com.sun.proxy.$Proxy0.say(Unknown Source)
     *     at com.example.tests.T1test.main(T1test.java:14)
     * @throws Throwable
     */


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class T1Handler implements InvocationHandler {
   
     private Object target; //目标方法的调用对象


    public T1Handler(Object target) { //利用
        this.target = target;  
    }



    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         System.out.println("T1Handler开始工作,这里为可以强化的功能");
        System.out.println("这里可以增强功能代码");
        Object re=method.invoke(target,args);//调用 你要增强的代码 实现原有的功能
        System.out.println("这里可以增强功能代码");
        return re;
    }
}

 学习所准备的要增强的类

要增强的方法

public interface ITC1 {
   String[] say(String...str);
}

实现这个方法的类


import java.lang.reflect.Proxy;

public class TC1 implements ITC1{
    public String[] say(String...str){
        System.out.println("原有代码执行开始");
        for (int i = 0; i <str.length ; i++) {
            System.out.println("TC1的say开始工作第"+i+"个参数是"+str[i]);
        }
        System.out.println("原有代码执行结束");
        return str;
    }
}

下面是如何调用增强后的方法

public static void main(String[] args) {
        ITC1 tc1 = new TC1();
        T1Handler t1Handler=new T1Handler(tc1);
        ITC1 proxyTC1= (ITC1) Proxy.newProxyInstance(
                tc1.getClass().getClassLoader(),
                tc1.getClass().getInterfaces(),
                t1Handler
        );
        String[] re=proxyTC1.say(new String[]{"狗1","狗2","狗3"});
        System.out.println(re);
    }

结果如下

T1Handler开始工作,这里为可以强化的功能
TC1的say开始工作第0个参数是狗1
TC1的say开始工作第1个参数是狗2
TC1的say开始工作第2个参数是狗3
re的返回类型为:[Ljava.lang.String;
[Ljava.lang.String;@2c7b84de

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值