IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 动态代理、工厂模式、注解相结合实现对象创建 -> 正文阅读

[Java知识库]动态代理、工厂模式、注解相结合实现对象创建


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactoryAnnotationCombine {
    public static void main(String[] args) {
        new MessageService().send();
    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface UseMessage{
    Class<?> clazz();
}

/**
 * 通过更改注解传入的类,
 * 可以去低耦合的去传入类型。
 * 从而实现去创建对象
 *
 */
//@UseMessage(clazz = MessageImpl.class)
@UseMessage(clazz = QQMessageImpl.class)
class MessageService{
    private IMessage iMessage;
    public MessageService(){
        /*
            通过注解去获取具体的类
            然后传递给工厂去实例化
            工厂可以实例化
         */
        UseMessage useMessage = MessageService.class.getAnnotation(UseMessage.class);
        try {
            Class clazz = useMessage.clazz();
            this.iMessage = (IMessage)MessageFactory.getInstance(clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void send(){
        this.iMessage.send();
    }
}


class MessageFactory{
    private MessageFactory(){}
    public static <T>T  getInstance(Class<T> clazz){ // 传进来的就是需要直接创建对象的类
//        try {
//            return (T) clazz.getClass().getConstructor().newInstance();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;

        try {
            return (T)new MessageProxy().bind(clazz.getDeclaredConstructor().newInstance());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}


class MessageProxy implements InvocationHandler{
    private Object object;

    public Object bind(Object object){
        this.object = object;
        return Proxy.newProxyInstance(this.object.getClass().getClassLoader(), this.object.getClass().getInterfaces(), this);
    }

    public boolean connect(){
        return true;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object retData = null;
        try {
            if(connect()){
                System.out.println("链接成功");
                retData = method.invoke(this.object, args);
            }
            // 当前委托对象调用方法
            return retData;
        } catch (Exception e) {
            throw new RuntimeException("连接失败");
        }
//        return null;
    }
}


class MessageImpl implements IMessage{
    @Override
    public void send() {
        System.out.println("发送");
    }
}

class QQMessageImpl implements IMessage{
    @Override
    public void send() {
        System.out.println("qq发送");
    }
}
interface IMessage{
    void send();
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:48:23  更:2022-03-06 12:52:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:50:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码