您的位置:首页 > 编程语言 > Java开发

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

2017-08-28 18:35 1196 查看

开发工具: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
}

}


最终运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息