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

本文介绍了一个使用IntelliJ IDEA和Kotlin开发的工具,该工具能够根据JSON数据自动生成对应的实体类,或者根据数据库表结构映射生成实体类对象。核心功能包括创建父类与子类,并能在IDEA编辑器中直接生成代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具: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.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.DataKeys
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiUtilBase

class 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
    }

}

最终运行结果:

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值