`
yaoweinan
  • 浏览: 137525 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java 动态代理及自定义标注使用例子

    博客分类:
  • j2se
 
阅读更多

java中动态代理,在实际应用中有着很大的作用,譬如在一些类似的操作之前进行某种逻辑处理,或者在操作之后进行记录操作日志  用java的代理给类似的操作抽象出相同的代理部分,不同的信息用注解之类的统一模板,会给应用带来很大方便。如下例中用注解来控制是否允许删除的小例子。

自定义注解@Scope

package my.service;

import java.lang.annotation.Retention;

/**
 * @author Lyon Yao
 *
 */
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) 
public @interface Scope {
	String value();
}

 动态代理类,在类中根据注解判断是否执行

package my.aop;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import my.service.Scope;

/**
 *  代理类 
 * @author Lyon Yao
 *
 */
public class ProxyFactory implements InvocationHandler{

 private Object targetObject;
 public  Object instanceProxy(Object object){
  this.targetObject=object;
  return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),this.targetObject.getClass().getInterfaces(), this);
 }
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
//  return this.invoke(method, args);
  System.out.println("pa");
  Class<?> [] parameterTypes=method.getParameterTypes();
  Method tmp_m = this.targetObject.getClass().getMethod(method.getName(),parameterTypes );
  Annotation[] anns=tmp_m.getAnnotations();
  Object result=null;
  if(anns!=null&&anns.length>0){
   for(int i=0;i<anns.length;i++){
    Annotation ann=anns[i];
    if(ann.annotationType().equals(Scope.class)){
     Scope gen=(Scope) ann;
     String values=gen.value();
     if(values==null){
      return this.invoke(method, args);
     }else {
       if(values.equals("yes")){
        return this.invoke(method, args);
       }else if(values.equals("not")){
        return result;
       }else{
        return this.invoke(method, args);
        
       }
     }
     
    }else{
     return this.invoke(method, args);
    }
   }
  }else{
   return this.invoke(method, args);
  }
  return result;
 }
 private Object invoke(Method method,Object agrs[]) throws Throwable{
  return method.invoke(this.targetObject, agrs);
  
 }

}

 

代理接口

 

package my.service;

/**
 * 用户信息操作(接口)
 * @author Lyon Yao
 *
 */
public interface UerService {
	/**
	 * 保存
	 */
	public void save(String user);
	/**
	 * 获取
	 * @return
	 */
	public String get();
	/**
	 * 删除
	 */
	public void delete();
}

 

接口实现类

package my.service.impl;


import my.service.Scope;
import my.service.UerService;

/**
 * 用户信息管理(实现)
 * @author Lyon Yao
 *
 */
public class UserServiceImpl implements UerService {
	private String user=null;
	
	public UserServiceImpl(String user) {
		super();
		this.user = user;
	}
	public UserServiceImpl() {
		super();
	}
	@Scope(value="not")
	public void delete() {
		System.out.println(user+"deleted");		
	}
	@Scope(value="yes")
	public String get() {
		System.out.println(user+"geted");
		return user;
	}
	@Scope(value="not")
	public void save(String user) {
		System.out.println(user+"saved");	
	}

	public String getUser() {
		return user;
	}
	
}

 

利用junit进行测试

package my.aop.test;


import my.aop.ProxyFactory;
import my.service.UerService;
import my.service.impl.UserServiceImpl;

import org.junit.BeforeClass;
import org.junit.Test;

/**
 * @author Lyon Yao
 *
 */
public class UserServiceMethodControlTest {
	private static  ProxyFactory proxy;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		proxy=new ProxyFactory();
	}
	@Test public void testDelete(){
		UerService userService=(UerService) proxy.instanceProxy(new UserServiceImpl("test"));
		userService.delete();
		userService.get();
		userService.save("mam");
	}

}

 外面虽然进行了删除,获得,保存

但实际操作却打印出

pa
pa
testgeted
pa

说明只要获得执行了,看了这个小例子你有啥感想呢,在spring中方法的权限这里是不是这么做出来的呢?我不清楚,但猜可能是的。

分享到:
评论

相关推荐

    Java软件开发实战 Java基础与案例开发详解 16-3 自定义标注类型 共7页.pdf

    ### Java软件开发实战:自定义标注类型 #### 16.3 自定义标注类型 **标注(Annotation)** 是Java 5引入的一个重要特性,它为元数据提供了一种标准化的方式来描述程序元素(如类、方法等)。通过使用标注,开发者...

    实现自定义标注并注入

    在IT行业中,自定义标注和依赖注入是两个关键的概念,特别是在构建可扩展和灵活的应用程序时。本篇文章将深入探讨这两个主题,并结合“memcache”的安装过程,展示它们如何在实际开发中发挥作用。 首先,让我们从...

    Spring IOC 原理 ,Java 反射实例,自定义注解

    关于Java反射的实例,我们可以创建一个简单的例子。假设我们有一个接口`Service`和两个实现类`ServiceImpl1`、`ServiceImpl2`。在不使用反射的情况下,我们通常会通过new关键字创建服务对象。而通过反射,可以在运行...

    java高级特性,涵盖了多种java常用的一些例子

    涉及多种线程,死锁,同步队列,异步线程,涵盖了java的自定义注解及反射,包含了23种设计模式,含注释, 线程1(基本应用) 线程2(同步,死锁,线程池) 注解和泛型 Java 注解(Annotation)又称 Java 标注,是 ...

    ArcGIS+Server+Java讲座

    5、使用图片和TrueType字体进行标注 10 6、Server Java讲座-----扩展Tasks框架 13 7、Server Java 开发实战---自定义command 19 8、 ArcGIS Server Java 讲座--ADF 体系结构 第一部分 21 9、ArcGIS Server JAVA讲座-...

    Java使用自定义注解实现为事件源绑定事件监听器操作示例

    首先,自定义注解的定义是使用Java注解类型来声明一个特殊的接口,这个接口被用于标注在类、方法或字段上,以提供额外的元数据信息。在我们的例子中,定义了一个名为`ActionListenerFor`的注解,它通过使用`@Target...

    Java2程序设计150例(源代码)

    例子可能涵盖自定义注解和预定义注解的使用。 10. **I/O流的NIO(New IO)**:Java NIO提供了一种非阻塞I/O模型,可以提高性能。例子可能涉及通道、缓冲区、选择器的使用。 11. **网络编程**:Java提供了Socket...

    Annotation使用手册

    例如,可以使用 `@NonNull` Annotation 来标注不允许为 null 的变量,并通过配套的 Annotation 处理器来检查这些变量是否确实未被赋予 null 值。 #### 三、Annotation 的应用场景 - **代码生成**: 通过 Annotation...

    疯狂java讲义 程序源码

    - 注解:自定义注解及其处理器,用于代码的元数据标注和编译时或运行时的处理。 9. **Java高级特性** - 内存管理和垃圾回收:理解Java内存模型,了解GC的工作原理。 - Lambda表达式和函数式编程:Java 8引入的新...

    [feiq]ArcGIS Server Java讲座.doc

    【ArcGIS Server Java 讲座】是一系列关于使用Java技术进行ArcGIS Server开发的专业文档,主要探讨了在ArcGIS Server中使用Java Server Faces (JSF)框架的原因和实践。以下是讲座涉及的一些关键知识点: 1. **为...

    中文分词+全文索引例子

    总结来说,这个例子涉及到的是如何使用中文分词技术和全文索引来构建一个搜索引擎或信息检索系统。通过理解分词的基本原理和全文索引的构建方法,我们可以实现高效地查找和检索中文文本信息,这对于构建面向中文用户...

    自定义基于接口,实体类注解脱敏

    在这个例子中,`User`类的`email`和`password`字段分别被注解,表明在展示或传输时,应该使用相应的策略进行处理,如电子邮件的掩码策略和密码的哈希策略。 实现这些注解的处理通常需要一个AOP(面向切面编程)框架...

    Java EE常用框架.xmind

    二、我们可以使用Java自带的WsImport来实现本地代理。这种方法会将WebService翻译成Java类,我们使用类一样去访问WebService就行了。非常好用。 三、除了调用别人发布的webService,也可以自己发布WebService...

    CSS样式 JS特效 Java小工具 文学文档 Java插件 截图软件

    “截图软件”是能够捕获计算机屏幕内容并保存为图像文件的工具,通常支持全屏、窗口、自定义区域等多种截图方式,并可能包含编辑、标注等功能。 从描述中的“博文链接”我们可以推测,这可能是一份关于编程学习或...

    java程序设计100例

    这个压缩包包含了100个不同的Java源代码示例,每个例子都是一个独立的程序,涵盖了Java语言的关键概念和常用技术。 首先,我们可以从基础部分开始探讨。对于Java初学者,了解基本语法是至关重要的,这包括变量声明...

    Think In java E4 原版 pdf下载

    9. **枚举和注解**:介绍Java枚举类型和注解的使用,它们在代码规范、元数据标注等方面的重要作用。 10. **设计模式**:简述一些常见的设计模式,如单例、工厂、观察者、装饰器等,以及如何在Java中实现这些模式。 ...

    java学习笔记JDK6课件之十七

    Java学习笔记JDK6课件第17章主要讲解了注解(Annotation)的使用,注解是Java语言中一种非常重要的元数据机制,它允许程序员在源代码中嵌入额外的信息,这些信息可以被编译器、IDE或运行时环境读取,以实现特定的功能...

    Java实效编程百例

    8. **反射和注解**:反射允许程序在运行时动态地获取类的信息和操作类的对象,而注解为元数据提供了一种方式,用于标注代码并自定义编译器或运行时的行为。 9. **JVM优化**:理解Java虚拟机的工作原理,包括内存...

    java做的CAD画图小工具

    对于初学者来说,这是一个学习Java图形界面编程和CAD设计原理的好例子;对于专业人士,它则提供了一个快速原型设计的平台。无论你是学生还是工程师,都可以尝试一下这个由Java打造的CAD小工具,感受它带来的便利。

Global site tag (gtag.js) - Google Analytics