java动态代理

一、简单反射

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

一句话总结:反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
反射的三种方式

  1. Class.forName(“类的完整路径”)
  2. 对象.getClass()
  3. 任何类型.class

invoke 调用方法

代码如下(示例):

ireflect.getClass().getMethod("方法名","参数类型").invoke("放射的对象","参数");

二、动态代理

1.代理类

代码如下(示例):

package com.design;
import com.design.impl.reflect;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class JDKProxy {
    public static <T> T proxyObject(Class<T> clazz ,Class< ? extends T> classAdapter) throws  Exception
    {
        InvocationHandler jdkInvocationHandler = new JDKInvocationHandler(classAdapter.newInstance());
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        return (T) Proxy.newProxyInstance(classLoader,new Class[]{clazz},jdkInvocationHandler);
    }
}

2.反射类

代码如下(示例):

package com.design;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class JDKInvocationHandler implements InvocationHandler {
    private Object ireflect;
    public  JDKInvocationHandler(Object ireflect)
    {
        this.ireflect = ireflect;
    }
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        return ireflect.getClass().getMethod(method.getName(),String.class).invoke(ireflect,objects);
    }
}

三、总结

动态代理写的通用的。动态代理记住逻辑就行, 反射就是 先用getMethod获取方法设置参数类型,然后invoke对象和参数 代理实现invocationHandler 把反射的逻辑写到实现类的方法里, 在代理方法那获取当前线程的类加载器 thread.currentThread().getContextClassloderLoder(),然后就是实现代理Proxy.newProxyInstance(加载器,代理的类,反射对象)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值