动态代理

博客介绍了Java中的多种代理方式,包括静态代理、装饰代理、jdk代理、cglib代理和javassist代理。重点阐述了jdk代理的原理,如继承InvocationHandler接口实现增强代码,通过生成字节码生成代理类等,还提及了代理类的调用逻辑和反编译代码。
public class UserManager implements UserManagerInterface {
    @Override
    public void function(){
        System.out.println("this is a function");
    }


    public UserManager() {
    }
}

package linag.test.dubbo.core.designmodel;

public interface UserManagerInterface {
    void function();
}

静态代理

package linag.test.dubbo.core.designmodel;


public class StaticProxy implements  UserManagerInterface{
    private UserManagerInterface userManagerInterface;
    public StaticProxy(UserManagerInterface userManagerInterface) {
        this.userManagerInterface = userManagerInterface;
    }

    @Override
    public void function() {
        System.out.println("执行之前做一些准备工作");
        userManagerInterface.function();
        System.out.println("执行之后做一些准备工作");
    }

    public static void main(String[] args) {
        StaticProxy staticProxy = new StaticProxy(new UserManager());
        staticProxy.function();
    }
}

装饰代理

package linag.test.dubbo.core.designmodel;

/**
 * @author wb-zgl234479
 * @create 2018/08/28 11:52
 **/

public class DecoratorProxyFilter implements UserManagerInterface{
    UserManagerInterface userManagerInterface;
    public DecoratorProxyFilter(UserManagerInterface userManagerInterface) {
        this.userManagerInterface = userManagerInterface;
    }

    @Override
    public void function() {
        System.out.println(this.toString());
        userManagerInterface.function();
    }

    public static void main(String[] args) {
        DecoratorProxyFilter filter1 = new DecoratorProxyFilter(new UserManager());
        DecoratorProxyFilter filter2 = new DecoratorProxyFilter(filter1);
        filter2.function();
    }
}

jdk代理

原理:http://www.cnblogs.com/zhangxinly/p/6974283.html
1、继承一个InvocationHandler接口,实现增强代码
2、获取接口的方法名、参数、返回值、异常等信息,通过生成字节码来生成代理类,代理类继承需要被代理的接口和Proxy类,Proxy类有一个构造方法

 protected Proxy(InvocationHandler var1) {
        Objects.requireNonNull(var1);
        this.h = var1;
    }

代理类的构造方法需要传入一个InvocationHandler的实现类,赋值到内部属性h,代理类存储接口的Method字段,字节码写入同名的方法。
代理类的调用逻辑是:
Proxy0.function(String arg) > h.invoke(Object proxy, Method method, String arg)(反射) > target.function(String arg)

代理类反编译以后的代码

final class $Proxy0 extends Proxy implements pro {
        //fields    
        private static Method m1;
        private static Method m2;
        private static Method m3;
        private static Method m0;

        public $Proxy0(InvocationHandler var1) throws  {
            super(var1);
        }

        public final boolean equals(Object var1) throws  {
            try {
                return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();
            } catch (RuntimeException | Error var3) {
                throw var3;
            } catch (Throwable var4) {
                throw new UndeclaredThrowableException(var4);
            }
        }

        public final String toString() throws  {
            try {
                return (String)super.h.invoke(this, m2, (Object[])null);
            } catch (RuntimeException | Error var2) {
                throw var2;
            } catch (Throwable var3) {
                throw new UndeclaredThrowableException(var3);
            }
        }

        public final void text() throws  {
            try {
                //实际就是调用代理类的invoke方法 
                super.h.invoke(this, m3, (Object[])null);
            } catch (RuntimeException | Error var2) {
                throw var2;
            } catch (Throwable var3) {
                throw new UndeclaredThrowableException(var3);
            }
        }

        public final int hashCode() throws  {
            try {
                return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();
            } catch (RuntimeException | Error var2) {
                throw var2;
            } catch (Throwable var3) {
                throw new UndeclaredThrowableException(var3);
            }
        }

        static {
            try {
                //这里每个方法对象 和类的实际方法绑定
                m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});
                m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
                m3 = Class.forName("spring.commons.api.study.CreateModel.pro").getMethod("text", new Class[0]);
                m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
            } catch (NoSuchMethodException var2) {
                throw new NoSuchMethodError(var2.getMessage());
            } catch (ClassNotFoundException var3) {
                throw new NoClassDefFoundError(var3.getMessage());
            }
        }
    }
package linag.test.dubbo.core.designmodel;

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



public class JdkProxy implements InvocationHandler {
    private Object proxyedObject;

    public JdkProxy(Object o) {
        proxyedObject = o;
    }


    @Override
    public Object invoke(Object object, Method method, Object[] arguments)
        throws Throwable {
        System.out.println(method.getName()+"执行之前做一些准备工作");
        Object res =  method.invoke(proxyedObject, arguments);
        System.out.println(method.getName()+"执行之后做一些准备的工作");
        return res;
    }

    public static void main(String[] args) {
        UserManagerInterface userManager =  (UserManagerInterface)Proxy.newProxyInstance(
            UserManagerInterface.class.getClassLoader(),
            new Class[] { UserManagerInterface.class },
            new JdkProxy(new UserManager())
        );
        userManager.function();
    }
}

cglib代理

package linag.test.dubbo.core.designmodel;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;


public class GglibProxy  {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        //生成指定类对象的子类,也就是重写类中的业务函数,在重写中加入intercept()函数而已。
        enhancer.setSuperclass(UserManager.class);
        //这里是回调函数,enhancer中肯定有个MethodInterceptor属性。
        //回调函数是在setSuperclass中的那些重写的方法中调用---猜想
        enhancer.setCallback(new CglibMethodInterceptor());
        //创建这个子类对象
        Object proxy = enhancer.create();
        //通过生成子类的方式创建代理类
        UserManager um = (UserManager)proxy;
        um.function();
    }



    public static class CglibMethodInterceptor implements MethodInterceptor{
        @Override
        public Object intercept(Object obj, Method method, Object[] args,
                                MethodProxy proxy) throws Throwable {
            System.out.println(method.getName()+"执行之前做一些准备工作");
            //一不小心写成下面被注释一行代码了。 StackOverflowError
            Object result = proxy.invokeSuper(obj,args);
            System.out.println(method.getName()+"执行之后做一些准备的工作");
            return result;
        }
    }
}

javassist代理

package linag.test.dubbo.core.designmodel;

import javassist.*;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;

import java.lang.reflect.Method;


public class JavasistProxy{
    public static void main(String[] args) {
        test2();
    }
    private static void test2() {
        try {
            ProxyFactory proxyFactory = new ProxyFactory();
            proxyFactory.setSuperclass(UserManager.class);
            Class<ProxyObject> proxyObjectClass = proxyFactory.createClass();
            UserManager proxyObject =(UserManager) proxyObjectClass.newInstance();
            UserManager targer = new UserManager();
            ((ProxyObject) proxyObject).setHandler(new MethodHandler() {
                @Override
                public Object invoke(Object o, Method method, Method method1, Object[] objects) throws Exception {
                    System.out.println("start");
                    method.invoke(targer, objects);
                    System.out.println("end");
                    return null;
                }
            });
            proxyObject.function();



        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
    private static void test1() {
        try {
        // 创建类池,true 表示使用默认路径
        ClassPool classPool = new ClassPool(true);

        String className = UserManager.class.getName();
        // 创建一个类 RayTestJavassistProxy
        CtClass ctClass = classPool.makeClass(className + "JavassistProxy");

        // 添加超类
        // 设置 RayTestJavassistProxy 的父类是 RayTest.
        ctClass.setSuperclass(classPool.get(UserManager.class.getName()));

        // 添加默认构造函数
        ctClass.addConstructor(CtNewConstructor.defaultConstructor(ctClass));

        // 添加属性
        ctClass.addField(CtField.make("public " + className + " real = new " +
            className + "();", ctClass));


        // 添加方法,里面进行动态代理 logic
        ctClass.addMethod(CtNewMethod.make("public void function() { real.function();}",
            ctClass));
        Class<UserManager> testClass = null;

            testClass = ctClass.toClass();

        UserManager userManager = testClass.newInstance();
        userManager.function();
        } catch (CannotCompileException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NotFoundException e) {
            e.printStackTrace();
        }
    }


}


个人防护装备实例分割数据集 一、基础信息 • 数据集名称:个人防护装备实例分割数据集 • 图片数量: 训练集:4524张图片 • 训练集:4524张图片 • 分类类别: 手套(Gloves) 头盔(Helmet) 未戴手套(No-Gloves) 未戴头盔(No-Helmet) 未穿鞋(No-Shoes) 未穿背心(No-Vest) 鞋子(Shoes) 背心(Vest) • 手套(Gloves) • 头盔(Helmet) • 未戴手套(No-Gloves) • 未戴头盔(No-Helmet) • 未穿鞋(No-Shoes) • 未穿背心(No-Vest) • 鞋子(Shoes) • 背心(Vest) • 标注格式:YOLO格式,适用于实例分割任务,包含边界框或多边形坐标。 • 数据格式:图片数据,来源于监控或相关场景。 二、适用场景 • 工业安全监控系统开发:用于自动检测工人是否佩戴必要的个人防护装备,提升工作场所安全性,减少工伤风险。 • 智能安防应用:集成到监控系统中,实时分析视频流,识别PPE穿戴状态,辅助安全预警。 • 合规性自动化检查:在建筑、制造等行业,自动检查个人防护装备穿戴合规性,支持企业安全审计。 • 计算机视觉研究:支持实例分割、目标检测等算法在安全领域的创新研究,促进AI模型优化。 三、数据集优势 • 类别全面:覆盖8种常见个人防护装备及其缺失状态,提供丰富的检测场景,确保模型能处理各种实际情况。 • 标注精准:采用YOLO格式,每个实例都经过精细标注,边界框或多边形坐标准确,提升模型训练质量。 • 真实场景数据:数据来源于实际环境,增强模型在真实世界中的泛化能力和实用性。 • 兼容性强:YOLO格式便于与主流深度学习框架(如YOLO、PyTorch等)集成,支持快速部署和实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值