java反射机制&Annotation详解_II

JDK动态代理和CGlib动态代理

1.JDK动态代理

JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。

接口1  Man.java

//接口1
public interface Man {

 public void work();  

    public void run();
}

接口2  Women.java

//接口2
public interface Women {

 public  void shopping();
}

实现接口类Person.java

public class People implements Man, Women {

 public void run() {
  System.out.println("男人:兄弟快跑第二季");
 }
 public void work() {
  System.out.println("男人:努力工作");
 }
 public void shopping() {
  System.out.println("女人:打扮漂漂亮亮的");
 }
}

代理类  DynamicProxy.java

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

public class DynamicProxy implements InvocationHandler {

 // 需要被代理类的引用
 private Object object;

 // 构造方法
 public DynamicProxy(Object object) {
  this.object = object;
 }

 public Object getProxy() {
  //通过Proxy类的newProxyInstance方法动态生成一个动态代理,并返回它
  //java还让这个动态生成的$Proxy0类实现了要代理类的实现的所有接口,并继承了Proxy接口。
  //得到的其实是一个类名叫$Proxy0 extends Proxy implements ***Interface的类
  return Proxy.newProxyInstance(object.getClass().getClassLoader(),
    object.getClass().getInterfaces(), this);
 }

 //重写invoke方法,这里处理真正的方法调用
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  beforeDoing();

  Object invoke=method.invoke(object, args);

  afterDoing();

  return invoke;
 }

 public void beforeDoing(){
  System.out.println("-------------before---------------");
 }
 public void afterDoing(){
  System.out.println("-------------after----------------");
 }
}

测试类  Test.java

public static void main(String[] args) {
   People realSubject=new People();

   DynamicProxy dynamicProxy=new DynamicProxy(realSubject);

   Man man=(Man) dynamicProxy.getProxy();
   man.work();
   man.run();

   Women women=(Women)dynamicProxy.getProxy();
   women.shopping();
 }

运行结果


-------------before---------------

男人:努力工作

-------------after----------------

-------------before---------------

男人:兄弟快跑第二季

-------------after----------------

-------------before---------------

女人:打扮漂漂亮亮的

-------------after---------------- 

2.CGlib动态代理

CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring
AOP和dynaop,为他们提供方法的interception(拦截)。最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(mock)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(mock)对象。

实现类 Man.java

public class Man {

	public void work(){
		System.out.println("要去上班咯");
	}
}

代理类Cglib.java

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Cglib implements MethodInterceptor {

	private Object target;

	public Object getInstance(Object target){
		this.target=target;
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		//回调方法
		enhancer.setCallback(this);
		//创建代理对象
		return enhancer.create();
	}

	/**
	 * 拦截器,在这里你可以为所欲为
	 */
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		 System.out.println("----上班之前打卡------");
		 proxy.invokeSuper(obj, args);
		 System.out.println("----上班后打球去-------");
		 return null;
	}
}

测试类Test.java

public class Test {

	public static void main(String[] args) {
		// 代理类
		Cglib cglib = new Cglib();

		// 实现类
		Man impl = (Man) cglib.getInstance(new Man());
		impl.work();
	}
}

运行结果:


----上班之前打卡------

要去上班咯

----上班后打球去------- 

参考博客: http://blog.csdn.net/hintcnuie/article/details/10954631

http://www.iteye.com/topic/683613/

我是菜鸟,我在路上。

2015年5月28日14:49:44

时间: 2024-08-27 22:20:48

java反射机制&Annotation详解_II的相关文章

Java反射机制深入详解

一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来.Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息. (来自Sun) Java

Java自定义注解Annotation详解

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 自定义注解及其应用 1).定义一个最简单的注解 public @interface MyAnnotation { //...... } 2).把注解加在某个类上: @MyAnnotation public class Annot

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1

【转载】JAVA回调机制(CallBack)详解

转载自http://www.cnblogs.com/heshuchao/p/5376298.html 序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?java学习爱好者 2019-05-20 19:08前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现

Java 反射机制详解(下)

续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象. 获取字节码文件对象的三种方式.  1.Class class1= Class.forName("全限定类名"); //通过Class类中的静态方法forName,

【转载】Java反射机制详解

转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个

Java反射机制Class类的用法详解

本文转自http://blog.sina.com.cn/s/blog_6c9536b90100rqh4.html,感谢作者 java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识! java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息. 当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象