`

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配置,就是约定和习惯用法优先的一种实现方式。在一个大家都统一惯用法优先的项目里面,搞这个还是有用的。

相关推荐

    JAVA元数据编程零接触 -- 实现简单的MVC跳转控制雏形

    在Java开发中,元数据编程是一种强大的工具,它允许开发者通过元数据来描述代码的行为,而不是硬编码在程序中。这种技术在很多框架中得到广泛应用,例如Spring框架。本篇文章将探讨如何在Java环境中,利用元数据编程...

    JAVA在商务中的应用.外文原文

    - **元数据建模**:元数据是对数据的描述性信息,可以帮助理解和管理数据。Java支持使用元数据进行建模,便于数据的结构化和标准化。 - **XML**:可扩展标记语言(XML)是一种用于存储和传输数据的标准格式。Java...

    java代码自动生成,模版式工程单表的增删改查接口控制器等

    2. **表元数据获取**:连接建立后,工具会查询数据库获取表的信息,包括字段名、类型、主键、外键等。这些信息是生成代码的基础。 3. **Freemarker模板**:Freemarker是一个强大的模板引擎,允许开发者定义代码结构...

    JAVA中的数据字典

    8. **元数据**:在Java中,元数据是关于数据的数据,如字段的数据类型、长度、精度等。这些信息在构建数据字典时非常重要,可以使用Java反射API来获取。 9. **异常处理**:在处理数据时,错误和异常是常见的。Java...

    获取springMVC中所有http接口及参数元数据示例工程

    元数据是指与接口相关的非数据信息,如参数类型、参数名、参数描述、返回值类型等。在Spring MVC中,可以通过反射和注解解析来获取这些元数据。例如,`@RequestParam`、`@PathVariable`、`@RequestBody`等注解提供了...

    oracle 根据数据库自动生成JAVA代码

    总结来说,"Oracle根据数据库自动生成JAVA代码"是一个集成开发环境(IDE)或代码生成工具的功能,它利用元数据信息自动生成Java项目的基本架构,包括实体类、DAO、Service、Controller以及前端HTML模板。这种自动化...

    Java基础应用实例

    17. **注解(Annotation)**:元数据,用于提供编译器或运行时的信息。 通过这些基础应用实例,初学者可以逐步熟悉Java语言,并通过实践提升编程技能。每完成一个实例,都能加深对Java语法和编程思维方式的理解。...

    java 代码自动生成器

    2. **元数据驱动**:通过分析数据库模式、ORM映射文件(如Hibernate的XML配置或JPA的注解)或者其他形式的数据源,自动生成与之对应的Java实体类、数据访问对象(DAO)、服务接口和服务实现等。 3. **代码片段集成*...

    基于元数据通用查询

    "struts"是一个用于构建MVC(模型-视图-控制器)架构的Java Web应用框架。它可以帮助开发者组织和控制应用的业务逻辑。在元数据查询中,Struts可能被用来设计和实现用户界面,接收查询参数,调用后端服务进行元数据...

    java 代码生成器

    这个“java代码生成器”可能基于一些预定义的模板或者通过元数据来动态生成符合业务需求的Java类、接口、方法等。在软件开发过程中,尤其是大型项目中,这种自动化代码生成技术被广泛应用。 **1. 代码生成器的优势*...

    Java程序设计与应用开发(第2版)

    《Java程序设计与应用开发(第2版)》是一本深度探讨Java编程语言以及其在实际应用中的开发方法的专业书籍。这本书涵盖了从基础语法到高级特性的全面内容,旨在帮助读者掌握Java编程的核心技能,并能将这些技能应用...

    java代码自动生成工具

    对于数据库支持,如Oracle和MySQL,代码生成工具会根据数据库的元数据自动生成相应的SQL语句和JDBC代码,包括增删改查等基本操作。同时,工具通常允许开发者自定义模板,以满足特定数据库的特性或公司的编码规范。 ...

    java代码生成器(mysql版)

    1. **数据库连接与元数据获取**:代码生成器首先需要建立到MySQL数据库的连接,通过JDBC API获取数据库的元数据,如表名、字段名、数据类型等。这些信息是生成代码的基础。 2. **实体类生成**:根据数据库表的字段...

    java代码生成器

    2. **元数据驱动**:可能依赖于数据库元数据或其他数据源来生成与数据模型相关的代码。 3. **代码质量**:生成的代码应遵循良好的编程规范,例如驼峰命名法、注释规范等。 4. **可扩展性**:允许添加新的生成规则...

    JAVA应用程序设计源码.rar

    8. **注解(Annotation)**:注解是元数据的一种形式,提供了一种安全的方法来将信息附加到代码中,而不影响其运行时行为。常见的注解如@Override、@Deprecated等。 9. **泛型**:泛型引入自Java 5,用于提供类型...

    java 代码生成器(java开发,附加源代码)

    2. **元数据解析**:通常,代码生成器需要从数据库或其他数据源获取元数据,例如表结构、字段类型等,这可能涉及到JDBC或ORM框架如Hibernate、MyBatis的使用。 3. **代码模板设计**:开发者需要设计符合项目规范的...

    JAVA JAVA JAVA JAVA JAVA JAVA JAVA

    10. **注解(Annotation)**:用于向编译器或JVM提供元数据,可以用于代码自动生成、编译时检查、运行时处理等。 11. **Spring框架**:Java最流行的IoC(控制反转)和AOP(面向切面编程)框架,广泛应用于企业级...

    java手机程序设计入门与应用-王森

    3. **AndroidManifest.xml**:这是每个Android应用的核心配置文件,用于声明应用的组件、权限和其他元数据。 4. **Activity和Intent**:Activity是Android应用的基本交互单元,Intent则用于启动Activity或传递数据...

    Java.Web应用开发.J2EE和Tomcat第2版

    11. **部署描述符**:在J2EE应用中,部署描述符(如web.xml或ejb-jar.xml)定义了应用的元数据,包括组件配置、安全设置、过滤器和监听器等。 12. **性能优化**:通过调整Tomcat配置、缓存策略、负载均衡和集群等...

Global site tag (gtag.js) - Google Analytics