`

java元数据应用 , 自动获取控制器的元数据描述

阅读更多
/**
	 * 获取指定包路径下的控制器列表
	 * @param packageName
	 * @return
	 */
	public static ArrayList<Class> getControllerListFromPackage(String packageName){
		ArrayList<Class> controllers = new ArrayList<Class>() ;
		Object prolbemObj = null;
		try {
			Class[] classes = ReflectUtil.getClassesFromPackage(packageName);
			for(Class cls : classes){
				prolbemObj = cls ;
				if (SysUtil.isController(cls)){
					controllers.add( cls );
				}
			}				
		}
		catch(Exception e){
			System.out.println("解析控制器时除了问题: " + prolbemObj);
		}
		finally{
			return controllers;
		}		 
	} 
	
	// -------------------------------------------------------
	public static String getAnnoDescription(Anno_Controller anno_ctl){
		if (anno_ctl != null)
			return anno_ctl.description() ;		
		return null ;
	}
	/**
	 * 取控制器的描述字符串,如果当前没有定义,则取其父类或者父接口的描述
	 * @param ctl
	 * @return
	 */
	public static String getControllerAnnoDescription(Class ctl){
		Anno_Controller anno_ctl = ((Anno_Controller) 
				ctl.getAnnotation(Anno_Controller.class)) ;
		String description = getAnnoDescription(anno_ctl);
		if (description != null)
			return description ;
		
		//否则取超类的描述符
		/**
		 * 因为java是单一继承,有可能出现
			 * 父类非控制器 : 未继承控制器接口 
			 * 子类是控制器 : 继承控制器接口
		 * 
		 * 当父类不是控制器时则跳出判断,从而获取控制器接口的元描述
		 */
		Class superClass = ctl.getSuperclass();//获取超类
		if ( isController(superClass)){
			return getControllerAnnoDescription(superClass);
		}
		else {
			//获取控制器接口的元描述
			return getControllerAnnoDescription(Controller.class);
		}
	}
 
写道
运行结果

找到控制器
class com.sinomagazine.fuseblog.controller.D
描述: 类: Default,缺省控制器
[actionIndex::d.do]
[actionIndex::删除帖子事件]
---------------------------------
class com.sinomagazine.fuseblog.controller.Default
描述: 类: Default,缺省控制器
[actionIndex::index.do]
[actionIndex::缺省事件]
---------------------------------

 

编写目的:

不想去配置控制器的配置文件,解决每组CRUD操作都占用至少4个Action类的问题,不想配置控制器文件,

 

使用命名约定,来降低编写的XML的繁琐...

 

有朋友说,使用Struts中的那个DispatcherAction 这个可以通过传入参数来解决每个action为1个类的问题...

但是这个似乎比之前的那种开发方式更繁琐,配置更艰难... 讨厌....

 

想实现一种类似于PHP的那种,无需,或者只需少量配置的开发模式,这里仅仅想实现配置控制器的这块实现自动化,0配置

思路已经大致想通,正在逐步实现的过程中..

 

package com.sinomagazine.fleajava;

import com.sinomagazine.fleajava.core.Interrupt;

/**
 * 单一入口
 *  
 * @author 色色
 * vb2005xu@iteye.com
 * 2009-7-3
 */
public class Runner {

	/**
	 * 运行控制器类
	 */
	public static void main(String[] args) throws Exception {   
		Interrupt interrupt = new Interrupt() ;
		interrupt.setControllerPackage("com.sinomagazine.fuseblog.controller");
		interrupt._do("Default", "index");   
    }
}

 

package com.sinomagazine.fuseblog.controller;

import com.sinomagazine.fleajava.controller.Controller;


import com.sinomagazine.fleajava.core.annotation.Anno_Action;
import com.sinomagazine.fleajava.core.annotation.Anno_Controller;
import com.sinomagazine.fleajava.core.annotation.Anno_View;

@Anno_Controller(description="类: Default,缺省控制器")
public class Default implements Controller {
	
	@Anno_Action(description="缺省事件")
	@Anno_View(url="index.do")
	public void actionIndex(){
		
	}

}

 

package com.sinomagazine.fuseblog.controller;

import com.sinomagazine.fleajava.controller.Controller;


import com.sinomagazine.fleajava.core.annotation.Anno_Action;
import com.sinomagazine.fleajava.core.annotation.Anno_Controller;
import com.sinomagazine.fleajava.core.annotation.Anno_View;

public class D extends Default implements Controller {
	
	@Anno_Action(description="删除帖子事件")
	@Anno_View(url="d.do")
	public void actionIndex(){
		
	}
}

 

package com.sinomagazine.fleajava.controller;

import com.sinomagazine.fleajava.core.annotation.Anno_Controller;

@Anno_Controller(description="接口: Controller,每个控制器都必须实现此接口")
public interface Controller {
	/**
	 * 当前控制的名字
	 */
	public static String controllerName = null;
	/**
	 * 当前调用的动作名
	 */
	public static String actionName = null;
	
}

 

 

希望以后java的开发不再编程XML编程... XML是好,但是不要盲目崇拜吧...

 

前些时候看了国内某个 大唱快速开发的JAVA框架,我日,都是XML配置文件,一个接一个,我不想说什么?请问java程序员,是XML好看,还是java源文件好看啊....

 

可能我比较懒,所以.... 我对自己很无语...

分享到:
评论
5 楼 vb2005xu 2009-07-06  
出现的问题:
1. 类自身定义的
2. 从父类继承的
3. 子类覆盖父类的同名方法
4. 多态方法

这里对于前三个作为一个整体来解决

对于第四个,不予考虑,这里遵循如下约定:
1. action名字唯一,不允许多态
2. 仅仅public或者protected,并且使用@Anno_Action声明的,且遵循action命名规范的 如 : actionXxx 这样的才算action方法

对于前三个,很好实现.. 因为定义了action的唯一性,麻烦的只是父类中的同名方法,做了轮询即可
4 楼 vb2005xu 2009-07-06  
public static ArrayList<String> getActionListFromController(Class ctl) {
		ArrayList<String> actions = new ArrayList<String>(); 
		try {
			Method[] mets = ReflectUtil.getMethodsFromClass(ctl);
			for(Method m : mets){
				/**
				 * action 方法必须为public 或者 protected 方法
				 * 可以开启私有方法的访问,不过最好是不开启
				 * m.setAccessible(flag)
				 */
				if (m.getModifiers() == Modifier.PUBLIC || m.getModifiers() == Modifier.PROTECTED )
				{					
					if (SysUtil.isAction(m)) {						
						actions.add(m.getName());
					}
				}					
			}			
		} 
		catch (SecurityException e) {
			System.out.println("不允许访问该类中的已经声明的方法: " + ctl );
		}
		return actions ;
	}


每个控制器中有多少个action方法解决了一半,尚未解决从父类中继承的,应该很好解决... 对每个控制器做了限制,仅仅声明为共有或者保护并且使用了@Anno_Action来声明的才算是action
3 楼 vb2005xu 2009-07-06  
当前已经解决:
1. 指定路径下 存在多少个控制器类

正在解决:
1.每个控制器中有多少个action方法
2 楼 vb2005xu 2009-07-06  
对于JAVA的缺省XML配置,有朋友说我通过配置文件可以对每个控制器每个事件都进行权限控制,你现在搞这个完全是浪费时间,并且降低了安全性...

他说的也很对...

不过我向实现的东西他没有理解:
1. 我不仅仅不愿意配置action,我也不想配置控制器.就像上面的代码,我希望给他加上一个元数据标识就声明它是个控制器,对每个控制器里面的方法加上元标识就让他成为action方法,这些都有程序自动获取,无需通过配置文件一个个的设置,只需要告诉程序控制器在哪里找到即可

2. 对于效率,我实在不知道改怎么解答,因为这个东西还没有做完,即使是做完了,也是大量用到反射,可能效率也不高,我不知道Spring这些框架中是怎么实现高想念反射操作的,有空一定好好看看... 不过个人认为java解析XML文件占用的资源和效率不比直接解析类要少,对于解析,我也仅仅想在开始的解析一下,然后储存到内存中...这样效率是不是高一些呢

3. 我确实很懒,所以想少写东西,如果你不喜欢,也尽量不要恶意的去说我,(*^__^*) 嘻嘻…… 我脸皮毕竟还是不很厚

4. 对于安全性,我现在想的是 应该实现一个RBAC机制,我之前在做PHP项目时弄了一套RBAC系统,不也就是三张表么?PHP能轻易实现,这个我觉得也可以...

5. 畅想: 做成一个Spring的小插件,炒到其MVC框架中,通过自己实现一个Servlet类
... (*^__^*) 嘻嘻……

技术不够... 之前说的fuseblog已经摆到了自己线下的开发列表中... 希望通过这些东西来更好的学习学习 好好学习 天天向上
1 楼 buaalijie 2009-07-06  
所谓的0配置,就是约定和习惯用法优先的一种实现方式。在一个大家都统一惯用法优先的项目里面,搞这个还是有用的。

相关推荐

    Toxi / Oxy Pro 便携式气体检测仪参考手册 使用说明书

    Toxi Oxy Pro 便携式气体检测仪参考手册 使用说明书

    科傻模拟网优化操作-教程书

    官方的的说明书资料,部分视频说明在这里: https://www.bilibili.com/video/BV1Fz4y1d7rn/?spm_id_from=333.999.0.0&vd_source=13dc65dbb4ac9127d9af36e7b281220e

    node-v8.14.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2023商业银行数据资产体系白皮书,主要介绍了“三位一体”数据资产体系的构成与工作机制,以及商业银行数据资产体系建设实践

    2023商业银行数据资产体系白皮书 目录 第 1 章 数据资产化与数据要素市场化相辅相成,相互促进 第 2 章 数据资产化是企业数据治理向上演进的必经之路 第 3 章 数据资产体系发展概述 第 4 章 “三位一体”数据资产体系的构思 4.1“三位一体”数据资产体系的构成与工作机制 数据资产管理 数据资产运营 数据资产评价 数据资产体系工作机制 4.2“三位一体”数据资产体系的相互作用关系 4.3“三位一体”数据资产体系的构建 4.4“三位一体”数据资产体系的优势 第 5 章 商业银行数据资产体系建设实践 5.1商业银行开展数据资产体系建设的背景和目标 5.2商业银行数据资产体系建设的工作步骤 5.3上海银行数据资产体系建设实践的主要成果 第 6 章 数据要素流通市场赋能企业数据资产化 6.1全国多层次数据要素市场的建设 6.2上海数据交易所赋能企业数据资产化 6.3数据要素流通交易市场赋能企业数据资产化的展望 第 7 章 未来演进与展望

    基于微信小程序的助农扶贫小程序

    大学生毕业设计、大学生课程设计作业

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂.zip

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂

    毕业设计:基于SSM的mysql-学生社团管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_学生社团管理系统(源码 + 数据库 + 说明文档) 第2章 主要技术和工具介绍 1 2.1 JSP语言 1 2.2 MySQL数据库 1 2.3 jsp技术 2 2.4ssm简介 3 第3章 系统分析 1 3.1可行性分析 1 3.1.1经济可行性 1 3.1.2技术可行性 1 3.1.3操作可行性 1 3.2需求分析 1 3.3业务流程分析 2 3.4数据流程分析 3 第4章 系统设计 5 4.1系统结构设计 5 4.2功能模块设计 5 4.3数据库设计 6 4.3.1数据库设计概述 6 4.3.1概念设计 6 4.3.2表设计 7 第5章 系统实现 15 5.1基本任务 15 5.2登录模块的实现 15 5.2.1首页实现 15 5.2.2管理员后台登录 16 5.3用户模块的实现 19 5.3.1注册模块及登录的实现 19 5.2.2入团模块的实现 21 5.2.3场地预约模块的实现 22 5.4管理员模块的实现 24 5.4.1系统用户管理模块的实现 24 5.4.2活动公告管理模块的实现 26 5.5社团模块的实现 28 5.5.1活动信息

    大健康零售业务O2O数字化战略规划方案.pptx

    大健康零售业务O2O数字化战略规划方案.pptx

    数据中台项目主要岗位及其职责和任务

    数据中台项目主要岗位及其职责和任务

    node-v8.0.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    c语言学生成绩管理系统源码.zip

    c语言学生成绩管理系统源码.zip

    DEV-C++-5.11下载链接

    DEV-C++-5.11下载链接

    电器租赁小程序.zip

    电器租赁小程序.zip

    学生成绩管理系统 数据结构与算法课程设计 C++.zip

    学生成绩管理系统 数据结构与算法课程设计 C++

    知乎小程序算法.zip

    知乎小程序算法.zip

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    node-v6.13.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.11.0-darwin-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    项目申报系统(Struts2+Spring+Hibernate+Jsp+Mysql5).zip

    广东工业大学工程管理

Global site tag (gtag.js) - Google Analytics