精华内容
下载资源
问答
  • IDEA如何快速创建接口的实现类

    千次阅读 2019-11-11 17:13:29
    IDEA快速创建接口的实现类只要分成两步 第一步:先创建一个接口 第二步:用鼠标点击接口的名字上,同时按住Alt+Enter键 如图所示,出现下面的窗口 选择 implement interface,会出现下面的窗口 需要改名字的就改...

    IDEA快速创建接口的实现类只要分成两步

    第一步:先创建一个接口

    第二步:用鼠标点击接口的名字上,同时按住Alt+Enter键

    如图所示,出现下面的窗口

    在这里插入图片描述
    选择 implement interface,会出现下面的窗口
    在这里插入图片描述
    需要改名字的就改名字,如果不需要就直接点击OK,会进入下面的窗口,我这里就直接点击OK
    在这里插入图片描述
    因为是实现接口,所以所有的方法都需要重写,所以选择全部方法,然后点击Ok,然后就大功告成
    在这里插入图片描述

    展开全文
  • Java中如何动态创建接口的实现

    千次阅读 2017-06-18 12:38:02
    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1、mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现。 2、dubbo等分布式服务...创建接口的动态实现,有

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用:

    1、mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现。

    2、dubbo等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口。

    3、spring aop 这是最典型的动态代理了。

    创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理。

    代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。

    代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。


    通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(spring的AOP机制),设计上获得更大的灵活性。

     

    下面用JDK动态代理加一点简单的代码来演示这个过程:

    1、接口

    package com.yhouse.modules.daos;
    
    public interface IUserDao {
        public String getUserName();
    }

    2、创建代理

    复制代码
    package com.yhouse.modules.daos;
    
    import java.lang.reflect.Proxy;
    /**
     * 创建代理
     * @author clonen.cheng
     *
     */
    public class Invoker {
        
       
        public Object getInstance(Class<?> cls){        
            MethodProxy invocationHandler = new MethodProxy();        
            Object newProxyInstance = Proxy.newProxyInstance(  
                    cls.getClassLoader(),  
                    new Class[] { cls }, 
                    invocationHandler); 
            return (Object)newProxyInstance;
        }
    }
    复制代码

    3、运行时调用接口的方法时的实现(这一过程也称为接口的方法实现)

    复制代码
    package com.yhouse.modules.daos;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class MethodProxy implements InvocationHandler {
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {        
            //如果传进来是一个已实现的具体类(本次演示略过此逻辑)
            if (Object.class.equals(method.getDeclaringClass())) {  
                try {  
                    return method.invoke(this, args);  
                } catch (Throwable t) {  
                    t.printStackTrace();  
                }  
            //如果传进来的是一个接口(核心)
            } else {  
                return run(method, args);  
            }  
            return null;
        }
        
        /**
         * 实现接口的核心方法 
         * @param method
         * @param args
         * @return
         */
        public Object run(Method method,Object[] args){  
            //TODO         
            //如远程http调用
            //如远程方法调用(rmi)
            //....
           return "method call success!";
        }  
    
    }
    复制代码

    4、测试

    复制代码
    package com.yhouse.modules.daos;
    
    public class ProxyTest {
    
        
        public static void main(String[] args) {
            IUserDao invoker=(IUserDao)new Invoker().getInstance(IUserDao.class);
            System.out.println(invoker.getUserName());
        }
    
    }
    复制代码

    在这段测试代码中,并没有接口的任何实现,大家猜猜会是什么结果?
    控制台打印:

    说明接口在调用时,把实现委托给了代理,最后具体要做的就是这个代理里面的处理:

    在上面这段代码当中,可以看出,拿到了接口的method以及args,那么就可以做很多的事情,如根据方法名或者配合方法上面的注解来实现比较丰富的功能。

     

    一个简单的例子只是用来说明这个原理,下面再举一个远程接口动态调用的例子来加深理解。

    1、创建代理类和目标类需要实现共同的接口Service

    复制代码
    package com.markliu.remote.service;
    /**
     * Service接口。代理类和被代理类抖需要实现该接口
     */
    public interface Service {
        public String getService(String name, int number);
    }
    复制代码

     

    2、服务器端创建RemoteService类,实现了Service 接口。

    复制代码
    package com.markliu.remote.serviceimpl;
    import com.markliu.remote.service.Service;
    /**
     * 服务器端目标业务类,被代理对象
     */
    public class RemoteService implements Service {
        @Override
        public String getService(String name, int number) {
            return name + ":" + number;
        }
    }
    复制代码

     

    3、创建封装客户端请求和返回结果信息的Call类

    为了便于按照面向对象的方式来处理客户端与服务器端的通信,可以把它们发送的信息用 Call 类来表示。一个 Call 对象表示客户端发起的一个远程调用,它包括调用的类名或接口名、方法名、方法参数类型、方法参数值和方法执行结果。

    复制代码
    package com.markliu.local.bean;
    import java.io.Serializable;
    /**
     * 请求的javabean
     */
    public class Call implements Serializable{
        private static final long serialVersionUID = 5386052199960133937L;
        private String className; // 调用的类名或接口名
        private String methodName; // 调用的方法名
        private Class<?>[] paramTypes; // 方法参数类型
        private Object[] params; // 调用方法时传入的参数值
        /**
         * 表示方法的执行结果 如果方法正常执行,则 result 为方法返回值,
         * 如果方法抛出异常,那么 result 为该异常。
         */
        private Object result;
        public Call() {}
        public Call(String className, String methodName, Class<?>[] paramTypes, Object[] params) {
            this.className = className;
            this.methodName = methodName;
            this.paramTypes = paramTypes;
            this.params = params;
        }
        // 省略了get和set方法
    }
    复制代码

     

    4、创建动态代理模式中实际的业务处理类,实现了InvocationHandler 接口

    复制代码
    package com.markliu.local.service;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import com.markliu.local.bean.Call;
    
    public class ServiceInvocationHandler implements InvocationHandler {
    
        private Class<?> classType;
        private String host;
        private Integer port;
    
        public Class<?> getClassType() {
            return classType;
        }
        public ServiceInvocationHandler(Class<?> classType, String host, Integer port) {
            this.classType = classType;
            this.host = host;
            this.port = port;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            // 封装请求信息
            Call call = new Call(classType.getName(), method.getName(), method.getParameterTypes(), args);
            // 创建链接
            Connector connector = new Connector();
            connector.connect(host, port);
            // 发送请求
            connector.sendCall(call);
            // 获取封装远程方法调用结果的对象
            connector.close();
            Object returnResult = call.getResult();
            return returnResult;
        }
    }
    复制代码

     

    5、创建获取代理类的工厂RemoteServiceProxyFactory

    复制代码
    package com.markliu.local.service;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * 动态创建RemoteService代理类的工厂
     */
    public class RemoteServiceProxyFactory {
    
        public static Object getRemoteServiceProxy(InvocationHandler h) {
            Class<?> classType = ((ServiceInvocationHandler) h).getClassType();
            // 获取动态代理类
            Object proxy = Proxy.newProxyInstance(classType.getClassLoader(), 
                    new Class[]{classType}, h);
            return proxy;
        }
    }
    复制代码

     

    6、创建底层Socket通信的Connector类,负责创建拦截、发送和接受Call对象

    复制代码
    package com.markliu.local.service;
    // 省略import 
    
    /**
     * 负责创建链接
     */
    public class Connector {
        private Socket linksocket;
        private InputStream in;
        private ObjectInputStream objIn;
        private OutputStream out;
        private ObjectOutputStream objOut;
    
        public Connector(){}
        /**
         * 创建链接
         */
        public void connect(String host, Integer port) throws UnknownHostException, IOException {
            linksocket = new Socket(host, port);
            in = linksocket.getInputStream();
            out = linksocket.getOutputStream();
            objOut = new ObjectOutputStream(out);
            objIn = new ObjectInputStream(in);
        }
        /**
         * 发送请求call对象
         */
        public void sendCall(Call call) throws IOException {
            objOut.writeObject(call);
        }
        /**
         * 获取请求对象
         */
        public Call receive() throws ClassNotFoundException, IOException {
            return (Call) objIn.readObject();
        }
        /**
         * 简单处理关闭链接
         */
        public void close() {
            try {
                linksocket.close();
                objIn.close();
                objOut.close();
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    复制代码

     

    7、创建远程服务器

    复制代码
    package com.markliu.remote.main;
    // 省略import 
    
    public class RemoteServer {
    
        private Service remoteService;
        public RemoteServer() {
            remoteService  = new RemoteService();
        }
        public static void main(String[] args) throws Exception {
            RemoteServer server = new RemoteServer();
            System.out.println("远程服务器启动......DONE!");
            server.service();
        }
    
        public void service() throws Exception {
            @SuppressWarnings("resource")
            ServerSocket serverSocket = new ServerSocket(8001);
            while (true) {
                    Socket socket = serverSocket.accept();
                    InputStream in = socket.getInputStream();
                    ObjectInputStream objIn = new ObjectInputStream(in);
                    OutputStream out = socket.getOutputStream();
                    ObjectOutputStream objOut = new ObjectOutputStream(out);
                    // 对象输入流读取请求的call对象
                    Call call = (Call) objIn.readObject();
                    System.out.println("客户端发送的请求对象:" + call);
                    call = getCallResult(call);
                    // 发送处理的结果回客户端
                    objOut.writeObject(call);
                    objIn.close();
                    in.close();
                    objOut.close();
                    out.close();
                    socket.close();
            }
        }
    
        /**
         * 通过反射机制调用call中指定的类的方法,并将返回结果设置到原call对象中
         */
        private Call getCallResult(Call call) throws Exception {
            String className = call.getClassName();
            String methodName = call.getMethodName();
            Object[] params = call.getParams();
            Class<?>[] paramsTypes = call.getParamTypes();
    
            Class<?> classType = Class.forName(className);
            // 获取所要调用的方法
            Method method = classType.getMethod(methodName, paramsTypes);
            Object result = method.invoke(remoteService, params);
            call.setResult(result);
            return call;
        }
    }
    复制代码

     

    8、创建本地客户端

    复制代码
    package com.markliu.local.main;
    import java.lang.reflect.InvocationHandler;
    import com.markliu.local.service.RemoteServiceProxyFactory;
    import com.markliu.local.service.ServiceInvocationHandler;
    import com.markliu.remote.service.Service;
    
    public class LocalClient {
        public static void main(String[] args) {
            String host = "127.0.0.1";
            Integer port = 8001;
            Class<?> classType = com.markliu.remote.service.Service.class;
            InvocationHandler h = new ServiceInvocationHandler(classType, host, port);
            Service serviceProxy = (Service) RemoteServiceProxyFactory.getRemoteServiceProxy(h);
            String result = serviceProxy.getService("SunnyMarkLiu", 22);
            System.out.println("调用远程方法getService的结果:" + result);
        }
    }
    复制代码

     控制台打印结果:

    这个过程可以简单的归纳为:本地接口调用(客户端)--->本地接口代理实现(客户端)---->远程实现(服务器端)

     

    展开全文
  • 借助Spring Boot框架开发web项目时...不创建接口,通过把业务实现类直接通过注解@Autowired注入控制层Controller,也一点不耽误功能的实现啊,那么我为什么还要创建接口? 网上大部分回答都是说什么面向对象的解耦...

    借助Spring Boot框架开发web项目时,在业务层(Service)这一部分,标准做法是:定义一个接口,然后再一个或多个类去实现。那么疑问来了:  

    为什么我们要维护两份同构代码,而不直接使用一个类呢?

    不创建接口,通过把业务实现类直接通过注解@Autowired注入控制层Controller,也一点不耽误功能的实现啊,那么我为什么还要创建接口?

    网上大部分回答都是说什么面向对象的解耦云云,引经据典,说得都很好,然而,都没有从根本上回答我们关心的问题:为什么要用接口?

    业务层(Service)中为什么一定要用接口,不用行不行?回答:不是必须要使用接口,但强烈建议使用接口。

    情景1: 在开源框架中有很多这种情况,就是某个功能支持用户自定义扩展.说白了,它提供了一个接口,我们只需要实现这个接口,把我们自己的实现逻辑补上,就可以让框架按照我们的逻辑来执行.问题来了,框架的作者并不知道我们的实现类是什么,如果不定义一个接口,那么要如何在框架中调用我们的实现类呢?

    情景2: 我和同事分别做项目的2个不同功能模块,但是同事的功能中却需要调用我这头实现的部分逻辑.为了让他有一个"占位符"可用,我是不是应该快速的写个接口扔给他呢?

    情景3: 一个适配器功能,或是说一个简单的工厂类,如果没有定义接口,那么面对众多实现类,要如何统一操作呢?

    情景4: 想让项目的代码符合某种"规范",但是又不可能看着别人写代码吧,那好办,先出一套接口,然后你们就看着办~

    情景5:  java中没有多继承,但是可以多实现接口,那么就有一件很有趣的事情了,一个实现类可以实现多个接口,然后此时接口可以有选择的暴露实现类的部分方法,做到"窄化"实现类功能的目的。

    当然例子还有很多,这些情况其实可以说是接口好处的体现,所以java有面向接口编程的建议,但是说回Service层一定要有接口吗?那到未必,因为说到底,多一个接口仅仅是扩展性和某些情况下有优势,但是是否会用到接口的便利性,不确定的情况下我们未必一定要为"可能"买单,只是多写那几行代码,付出一点就可能避免"未来"的大"麻烦",何乐而不为!?

    下面简单列出Spring Boot中业务层(Service)的创建步骤及应用(更加详细的可参见我的视频:https://edu.51cto.com/sd/091c7):

          1) 接口及实现类命名方式,接口XXXService,实现类:XXXServiceImpl。

          2) 实现类XXXServiceImpl需添加注解@Service,并指明名称,如@Service("companyService");

          3) 在实现类中,通过注解@Autowired,注入数据仓库层Repository接口;

          当实现的接口涉及数据库数据的删除或修改时,方法上一定要添加注解@Transactional,否则会执行不成功。

    展开全文
  • idea中如何创建接口

    万次阅读 2019-11-12 09:44:33
    1、选择文件夹的包名,右键【New】------>【Java Class】,如下图: 2、在弹出的【Create New Class】窗口中,Name选择框中输入接口名称,Kind选择框中选择【Interface】类型。...3、创建好的接口如下图所示: ...

    1、选择文件夹的包名,右键【New】------>【Java Class】,如下图:
    在这里插入图片描述2、在弹出的【Create New Class】窗口中,Name选择框中输入接口名称,Kind选择框中选择【Interface】类型。如下图:
    在这里插入图片描述3、创建好的接口如下图所示:
    在这里插入图片描述

    展开全文
  • 上次分享了用webpack的express模块快速启动一个服务接口,其实webpack还有HTTP模块也可以快速创建接口,有兴趣的可以去查查。今天要分享的也是基于express,但是是通过webpack的decServer创建的,不存在跨域问题。 ...
  • Jmeter快速创建接口测试脚本

    千次阅读 2019-09-12 19:40:55
    使用此接口之前,需要在聚合平台进行注册,下单申请接口,大多数接口都有免费次数,非常方便大家学习接口测试。 操作流程 启动Jmeter 添加“线程组” 右击“测试计划”,选择“添加”\“线程(用户)”\“线程...
  • ##支付宝小程序支付(统一收单交易创建接口)。自己刚刚花的一点时间整好了。所以现在记录一下。以防老年痴呆。 1.先设置好小程序的应用公钥(我是一家设置好了的) 2.保存自己设置的公钥和私钥 3.把刚刚用到的...
  • 微信公众号自定义菜单创建接口

    千次阅读 2018-04-27 07:59:40
    3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消...
  • 一、Spring Boot中的业务层(Service)是否要创建接口? 借助Spring Boot框架开发web项目时,在业务层(Service)这一部分,标准做法是:定义一个接口,然后再一个或多个类去实现。那么疑问来了: 为什么我们要维护两...
  • 微信公众号--自定义菜单创建接口

    千次阅读 2019-03-02 10:23:33
    * @param $url 接口 url * @param string $type 请求类型 * @param string $res 返回数据类型 * @param string $arr post请求参数 * @return mixed */ public function http_curl($ur...
  • 一 ,定义接口和抽象类 interface IPerson{ //获取名字 fun getName():String //获取身份证ID fun getID():String } abstract class BaseAnimal{ abstract fun getVoice():String } 二,创建对应的匿名...
  • System.out.println("自定义菜单创建接口" + jsonObject); } 注: HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP ...
  • Alt+Insert 选择需要重写的方法即可
  • 错误如图 ![图片说明](https://img-ask.csdn.net/upload/201611/26/1480152652_131248.png) 但我明明在下面的代码中设置成rsa了。 ... AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
  • 创建Java中的接口

    千次阅读 2018-05-22 15:13:18
    前言:进来的伙伴们是不是发现在类中创建不了...在包的类文件class中是不允许创建接口的,接口需要到包中创建接口的专属文件interface创建方法:没错,跟类的创建一样,直接点击interface就可以编写自己的接口啦!...
  • 创建接口,及为接口创建属性访问器 (1) //@property是声明控件的属性 例: @property(nonatomic,retain) IBOutlet UITextField *nameField;////////////实现name文本字段的输出口 @property(nonatomic,retain) ...
  • Java 接口类型的创建及使用

    千次阅读 2017-10-31 15:33:51
    一、创建接口文件 IComparable  package Interface;  public interface IComparable extends Comparable{  public int comparableto(T obj);  } 二、实现接口类型 Emploee  package Interface
  • Linux 创建虚拟接口

    千次阅读 2019-06-21 16:33:02
    1、创建dummy接口 ip link add dummy1 type dummy ip link set dummy1 arp on ip address add 10.0.2.2/24 broadcast + dev dummy1 ip link set dummy1 up 2、创建桥接接口 ip link add dummy1 type dummy ...
  • java创建http接口

    万次阅读 2017-10-11 14:31:21
    java创建http接口 标签: javahttp接口 2015-12-22 17:10 7330人阅读 评论(1) 收藏 举报  分类: java(13)  版权声明:本文为博主原创文章,未经博主允许不得转载。 1.修改...
  • 要展示的菜单样式,如下: 自定义菜单查询接口,查询出当前菜单结构: ...自定义菜单创建接口,注意点:需要把menu{ }这一层去掉,而不是按照查询接口的格式进行创建,否则菜单会创建失败 The End... ...
  • Spring boot创建一个对外接口

    千次阅读 2019-09-09 10:46:19
    Spring boot创建一个对外接口目录结构pom.xml配置Application.properties配置创建WebConfig,配置接口信息创建WebService和WebServiceImpl创建DataService和DataServiceImpl创建DataMapper和DataMapper.xml启动和...
  • 创建django项目写接口

    万次阅读 2019-03-12 18:32:46
    1、前两篇安装了pycharm专业版,也安装了python3,下一步创建django项目,就是用django起一个后端服务,可以写接口写逻辑,总之啥都能干,前后端分离的年代,一切通过接口来说话,打开pycharm——file——new ...
  • UE4 C++ 创建一个接口

    千次阅读 2019-01-08 15:19:40
    接口创建不需要通过编辑器,可以直接使用IDE将接口的.h和.cpp创建到项目目录下的Source文件夹下的工程名文件夹里。Source-&gt;项目名文件夹。 这里创建一个简单的空的接口MyInterface MyInterface.h #pragma ...
  • 接口可以创建对象吗

    万次阅读 2015-05-31 16:11:33
    一直以来,我一直认为接口是不可以创建对象的,随着学习的不断深入发现这是片面或错误的。接口存在的意义就是支持java的多态机制。java规定接口interface不能直接使用new关键字来创建对象,但并没有它不能创建对象。...
  • express创建api服务器( 接口

    千次阅读 2019-06-13 21:06:33
    express创建api接口 首先,我们在终端打开,用命令创建一个文件夹 $ npx express -e port // 创建一个port文件夹 如果你的npm版本不是5.2+以上,那么建议你可以先全局安装express再创建 $ npm i express-generator ...
  • Intellj idea快速创建某个接口的实现类

    万次阅读 多人点赞 2018-10-01 11:08:33
    1.创建一个接口,如下: 2.将鼠标放在接口的名称处按 Alt+Enter 键,就会出现下面页面: 3.鼠标左键单击:Implement interface ,进入创建实现类的名字以及指明其所在的包的界面。选择好之后,点击ok即可完成.....
  • 在用ATL创建组件时,我已经创建并实现了一个接口A,而当我在另一个接口B的实现中创建接口A的对象后,编译时,编译器提示接口A是个抽象类,不能创建。请问各位大侠是怎么回事?谢谢!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,296,168
精华内容 918,467
关键字:

创建接口