`
zhaojian0910
  • 浏览: 46508 次
社区版块
存档分类
最新评论

Java笔记之代理

阅读更多

1、静态代理

package staticProxy;

public interface Person {
	public void say();
}

package staticProxy;

public class Chinese implements Person {

	public void say() {
		System.out.println("I am chinese.");

	}

}

package staticProxy;

public class ChineseProxy implements Person {

	private Chinese chinese;

	public ChineseProxy(Chinese chinese) {
		this.chinese = chinese;
	}

	public void say() {

		System.out.println("Before say...");
		chinese.say();
		System.out.println("After say...");

	}

}

package staticProxy;

public class Test {

	
	public static void main(String[] args) {
		Chinese chinese = new Chinese();
		Person p = new ChineseProxy(chinese);
		p.say();
	}
}

 输出:Before say...

I am chinese.

After say...

 

2、JDK动态代理

package dynamicProxy;

public interface Person {
	public void say();
}

package dynamicProxy;

public class Chinese implements Person {

	public void say() {
		System.out.println("I am chinese.");

	}

}

package dynamicProxy;

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

public class DynamicProxy implements InvocationHandler {

	private Object target;

	public Object bind(Object target) {
		this.target = target;

		// 取得代理对象
		// 必须绑定接口,对于没有实现接口的类无法使用,cglib会弥补这个不足
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);
	}

	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {

		Object result = null;
		System.out.println("Before say...");
		result = arg1.invoke(target, arg2);
		System.out.println("After say...");
		return result;
	}

}

package dynamicProxy;

public class Test {

	public static void main(String[] args) {
		Chinese chinese = new Chinese();
		Person p = (Person) new DynamicProxy().bind(chinese);
		p.say();
	}
}

  输出:Before say...

I am chinese.

After say...

 

3、CGLIB实现的动态代理,不需要实现接口

需要使用委托类的派生出子类,因此,不支持final修饰的最终类

package cglibProxy;

public class Chinese{

	public void say() {
		System.out.println("I am chinese.");

	}

	
	public void eat() {
		System.out.println("Eating...");
		
	}

}

package cglibProxy;

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 CglibProxy 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();
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		System.out.println("Before say...");
		arg3.invokeSuper(arg0, arg2);
		System.out.println("After say...");
		return null;
	}

}

package cglibProxy;

public class Test {

	public static void main(String[] args) {
		Chinese chinese = (Chinese) new CglibProxy().getInstance(new Chinese());
		chinese.say();
		chinese.eat();
	}
}

 输出:Before say...

I am chinese.

After say...

Before say...

Eating...

After say...

 

分享到:
评论

相关推荐

    java反射与动态代理笔记

    java反射与动态代理

    早期自学java代理知识笔记

    早期自学java代理知识笔记

    Java Instrumentation笔记

    Java SE 6新特性:Instrumentation,利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决...

    JAVA实现动态代理的简单流程

    这个是个人做的JAVA实现动态代理的笔记

    java基础学习总结笔记

    Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多线程、Java常用类、集合(重点)、IO流、GUI图形界面、网络编程、正则表达式、反射、注解、类加载器、动态代理等等,另外还包括银行管理...

    16-Java代理模式的学习笔记1

    16-Java代理模式的学习笔记1

    java语言反射与动态代理学习笔记

    java语言反射与动态代理学习笔记

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    代理模式笔记.xls

    代理简介,静态代理,动态代理,23种设计模式之一,拦截器在在流行的开源框架中很常见,依赖的技术就是Java的动态代理。  理解拦截器的核心原理对理解这些开源框架的体系结构至关重要。  下面以一个简单的模型的...

    Java开发详解.zip

    031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义...

    java dtdl 动态代理

    JAVA,设计模式动态代理,学习笔记。

    Java基础最全笔记文档

    Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 2. Java基础语法、类型转换、运算符、Scanner 3. 分支结构、循环结构、随机数 4. 数组详解、Debug工具...

    java语言反射与动态代理学习笔记2(动态代理部分)

    NULL 博文链接:https://whp0731.iteye.com/blog/343787

    (java)AOP代理方面的简单介绍

    在学习java面向过程中,关于AOP代理这块,当时思路不是很清晰,借鉴了很多资料进行了解,后面把自己的一些见解整理成浅显的笔记进行加深印象,现在把它分享给学习AOP代理思路的朋友们,希望我的一点浅显的总结能够...

    Java物联网开发“尚方宝剑”之EMQ视频教程

    1.有一定JAVA编程基础,希望快速提升技术水平。 2.有一定项目开发经验,希望从事物联网行业应用开发的程序员。 课程内容: 1.MQTT协议 2.EMQ Dashboard 3.EMQ认证 4.日志与追踪 5.发布订阅ACL 6.WebHook 7.管理监控...

    LotusDomino学习笔记(400页涵盖代理和公式使用)

    108. Shortcut when printing from a Java Agent 278 109. Lotus Script: Write # statement 279 110. Lotus Script: Input # statement 280 111. 使用代理生成 XML 284 112. 使用视图生成 XML 286 113. 执行算术...

    动态代理及生成的代理类

    动态代理及其生成的代理类,可以反编译查看其类的结构。

    java核心面试笔记+核心知识源码降解

    通过带着读者从java基础到java编写spring全家桶框架面试以及技术讲解,例如:集合,数组,JVM,引用类型,IO/NIO,多线程,类加载机制,spring设计原理等内容实现。 适合人群:具备一定编程基础,工作3-5年的研发...

    清华妹子的Java仓库(进阶学习路线)

    《Java多线程核心技术》读书笔记 JDK源码 Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架源码解读(3)——LinkedHashMap Java集合框架源码解读(4)——...

Global site tag (gtag.js) - Google Analytics