Java动态代理demo

//业务接口
public interface PersonService {
     String sayHello();
}
//业务接口实现类
public class PersonServiceImpl implements PersonService {
    @Override
    public String sayHello() {
        SimpleDateFormat formatter = new SimpleDateFormat();
        System.out.println("hello," + formatter.format(new Date()));
        return formatter.format(new Date());
    }
}
  1. 静态代理
public class StaticProxyService implements PersonService {

    private PersonService personService;
    
    public StaticProxyService(PersonService personService) {
        this.personService = personService;
    }
    
    @Override
    public String sayHello() {
        System.out.println("静态 增强");
        return personService.sayHello();
    }
}
  1. jdk动态代理
public class JdkProxyService {
    public static Object getInstance(Object target){
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                PersonServiceImpl.class.getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("jdk 增强");
                        Object invoke = method.invoke(target, args);
                        return invoke;
                    }
                });
        return proxy;
    }
}
  1. cglib动态代理
public class CglibProxyService {
    public static Object getInstance(Object target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
            System.out.println("cgliab 增强");
            //不能使用method.invoke ,否在会再次进入intercept,造成死循环
            return methodProxy.invokeSuper(o, objects);
        });
        return enhancer.create();
    }
}

4.测试

public class ProxyTest {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }

    public static void test1() {
        StaticProxyService proxyService = new StaticProxyService(new PersonServiceImpl());

        proxyService.sayHello();
    }

    public static void test2() {
        PersonServiceImpl personService = new PersonServiceImpl();
        PersonService proxy = (PersonService) JdkProxyService.getInstance(personService);
        proxy.sayHello();
    }


    public static void test3() {
        PersonService personService = new PersonServiceImpl();
        PersonService proxy = (PersonService)CglibProxyService.getInstance(personService);
        proxy.sayHello();

    }
    }

运行结果
在这里插入图片描述
5.总结

  1. jdk动态代理: 被代理对象类必须实现接口;
  2. cglib动态代理: cglib是通过生成子类代理, 被代理对象可以是未实现接口的类,但不能用final修饰;

jdk动态生成的代理类

public final class $Proxy0 extends Proxy implements PersonService {
    private static Method m1;
    private static Method m3;
    private static Method m2;
    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});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

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

    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 int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m3 = Class.forName("com.hateapple.study.jichu.proxy.PersonService").getMethod("sayHello");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的MQTT Java Demo可以通过使用Eclipse Paho客户端库来实现。首先,你需要下载并导入Paho库,然后在你的Java项目中使用以下代码创建一个MQTT客户端: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttDemo { public static void main(String[] args) { String broker = "tcp://iot.eclipse.org:1883"; String clientId = "JavaClient"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient client = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); client.connect(connOpts); System.out.println("Connected to " + broker); String topic = "topic/demo"; int qos = 1; client.subscribe(topic, qos); String content = "Hello, MQTT!"; client.publish(topic, content.getBytes(), qos, false); System.out.println("Message published"); client.disconnect(); System.out.println("Disconnected"); } catch (MqttException me) { System.out.println("reason " + me.getReasonCode()); System.out.println("msg " + me.getMessage()); System.out.println("loc " + me.getLocalizedMessage()); System.out.println("cause " + me.getCause()); System.out.println("excep " + me); } } } ``` 在这个Demo中,我们创建了一个MqttClient实例并连接到一个MQTT代理。然后,我们订阅了一个名为"topic/demo"的主题,并向该主题发布了一条消息"Hello, MQTT!"。最后,我们断开了与代理的连接。这个Demo演示了如何使用Java语言来实现MQTT客户端,并进行连接、订阅和发布消息的操作。希望这能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值