idea插件开发之Java子类继承父类

来源:互联网 发布:手机知乎怎么复制 编辑:程序博客网 时间:2024/06/05 20:08

开发工具:IntelliJ IDEA

开发语言:Kotlin

当前代码的用场就是制作类似于gsonformat的工具 可以根据json生成对应的实体类
或者是根据数据库映射成对应的实体类对象

    lateinit var factory: PsiElementFactory//element工厂 包括生成控制 类,方法,变量    lateinit var project: Project    override fun actionPerformed(event: AnActionEvent?) {        project = event!!.project!!        factory = JavaPsiFacade.getInstance(project).elementFactory        var editor = event.getData(DataKeys.EDITOR)!!        var psiFile = PsiUtilBase.getPsiFileInEditor(editor, project)!!        var psiClass = (psiFile as PsiJavaFile).classes[0]        write(psiClass);    }

actionPerformed 是事件触发的时候调用的方法
event: AnActionEvent? 这个变量可以获取 idea工具当前触发的 窗口,文件,类,路径等

下面就是创建子类并且继承父类的核心代码

    /**     * 创建子类     * className:子类的名称     * parent:父类     */    fun createChildClass(className:String,parent: PsiClass): PsiClass {        var childClazz=factory.createClass(className)        //查询父类的范围        var scope= GlobalSearchScope.fileScope(parent.containingFile)        //父类的类型        var parentType= PsiClassType.getTypeByName(parent.name,project,scope)        //继承父类的类型        childClazz.getExtendsList()!!.add(factory.createReferenceElementByType(parentType));        return childClazz    } /**     * 创建一个父类     */    fun createParentClass(className:String):PsiClass{        var parentClass=factory.createClass(className)        return parentClass    }

上面两个是创建父类跟子类的方法

    /**     * 写入到编辑器里面     *     */    fun write(psiClass: PsiClass) {        //必须在当前的action里面写入添加事件才能写入到idea中  否则会报错        WriteCommandAction.runWriteCommandAction(project, object:Runnable {            override fun run() {                var parentClass=createParentClass("Animal")                var childClass=createChildClass("Dog",parentClass)                psiClass.add(parentClass)                psiClass.add(childClass)            }        });    }

全部代码:

import com.intellij.openapi.actionSystem.AnActionimport com.intellij.openapi.actionSystem.AnActionEventimport com.intellij.openapi.actionSystem.DataKeysimport com.intellij.openapi.command.WriteCommandActionimport com.intellij.openapi.project.Projectimport com.intellij.psi.*import com.intellij.psi.search.GlobalSearchScopeimport com.intellij.psi.util.PsiUtilBaseclass Test():AnAction() {    lateinit var factory: PsiElementFactory    lateinit var project: Project    override fun actionPerformed(event: AnActionEvent?) {        project = event!!.project!!        factory = JavaPsiFacade.getInstance(project).elementFactory        var editor = event.getData(DataKeys.EDITOR)!!        var psiFile = PsiUtilBase.getPsiFileInEditor(editor, project)!!        var psiClass = (psiFile as PsiJavaFile).classes[0]        write(psiClass);    }    /**     * 创建子类     */    fun createChildClass(className:String,parent: PsiClass): PsiClass {        var childClazz=factory.createClass(className)        //查询父类的范围        var scope= GlobalSearchScope.fileScope(parent.containingFile)        //父类的类型        var parentType= PsiClassType.getTypeByName(parent.name,project,scope)        //继承父类的类型        childClazz.getExtendsList()!!.add(factory.createReferenceElementByType(parentType));        return childClazz    }    /**     * 写入     *     */    fun write(psiClass: PsiClass) {        WriteCommandAction.runWriteCommandAction(project, object:Runnable {            override fun run() {                var parentClass=createParentClass("Animal")                var childClass=createChildClass("Dog",parentClass)                psiClass.add(parentClass)                psiClass.add(childClass)            }        });    }    /**     * 创建一个父类     */    fun createParentClass(className:String):PsiClass{        var parentClass=factory.createClass(className)        return parentClass    }}

最终运行结果:

运行结果

原创粉丝点击