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

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基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    达内是一家知名的教育机构,其整理的Java笔记通常会覆盖从基础到进阶的各种主题,以系统化的方式帮助学员掌握这门广泛使用的编程语言。 首先,Java的基础知识是必不可少的,这些笔记可能包括变量、数据类型、运算符...

    java笔记

    "Java笔记"通常会涵盖Java的核心概念和技术,这些内容对于初学者和经验丰富的开发者都是宝贵的资源。这里我们将深入探讨Java的一些关键知识点。 1. **Java基础**: Java的基础包括语法、数据类型、变量、运算符、...

    java笔记绝对干货

    以上内容是Java笔记中的核心部分,涵盖了从基础知识到进阶技术的多个层面。通过系统学习和实践,可以帮助开发者扎实地掌握Java编程,并具备解决实际问题的能力。在不断更新的技术环境中,Java依然保持着旺盛的生命力...

    JAVA学习笔记————————

    8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等高级功能至关重要。 9. **JNI(Java Native Interface)**:当JAVA代码需要调用本地(C/C++)代码时,JNI...

    Java学习笔记(源码)

    3. **异常处理**:Java的异常处理机制是其强大的特性之一,学习笔记会讲解如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,...

    王者归来之Thinking in java读书笔记

    《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...

    《Java学习笔记》

    这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...

    java反射与动态代理笔记

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...

    全套java笔记javaEE(上)

    【Java全套笔记】JavaEE(上)是一套全面的Java后端开发学习资料,涵盖了从基础到进阶的多个主题,旨在帮助开发者深入理解和掌握JavaEE技术栈。这份笔记集合了多个关键知识点,包括设计模式、开发工具的使用、实战...

    韩顺平java从入门到精通笔记完整版

    对于Java的高级特性,笔记会涵盖反射、动态代理、注解和模块系统。反射允许程序在运行时检查类的信息并操控它们,动态代理可以实现AOP(面向切面编程),注解则提供了一种元数据的方式,而模块系统(Jigsaw)则有助...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    java入门笔记.pdf

    这是Java开发者需要具备的核心知识之一,因为不当的内存管理可能会导致内存泄漏等问题。 整体来看,这份Java入门笔记是一份非常详尽的参考资料,适合初学者和有一定基础的开发者深入学习Java语言及其相关技术。通过...

    java面试笔记最新java面试笔记

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和...对于"面试笔记"这个文件,它很可能包含了以上所有领域的详细解答和实例,是准备Java面试的宝贵资料。通过深入学习和实践,可以显著提高面试成功率。

    JAVA上课笔记class_10

    ### JAVA上课笔记class_10:观察者模式与适配器模式详解 #### 观察者模式(Observer Pattern) 在Java编程中,观察者模式是一种常用的设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时...

    java学习笔记JDK6

    Java JDK 6学习笔记是Java开发者入门和进阶的重要参考资料,由知名作者林信良编著。本笔记主要涵盖了JDK 6版本的核心特性和关键概念,为读者提供了全面而深入的学习路径。以下是对其中重要知识点的详细阐述: 1. **...

    Java 基础 第3阶段:高级应用-尚硅谷学习笔记(含面试题) 2023年

    在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...

    良葛格Java学习笔记

    【良葛格Java学习笔记】 本笔记主要涵盖了Java编程语言的核心概念和技术,旨在帮助初学者以及有一定基础的开发者深入理解并掌握Java。Java作为一种广泛应用于企业级应用开发、移动开发(尤其是Android)以及大数据...

    个人Java学习过程中所有学习笔记

    这份"个人Java学习过程中所有学习笔记"包含了作者在学习Java时积累的宝贵经验,旨在帮助初学者或有经验的程序员巩固基础,提升技能。 笔记内容可能涵盖以下几个主要部分: 1. **Java基础**:这部分通常包括Java的...

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

    这篇学习笔记主要关注动态代理部分,虽然没有提供具体的压缩包文件内容,但根据标题和描述,我们可以深入探讨这两个概念。 **反射(Reflection)** 反射是Java语言的一个强大工具,它允许程序在运行时检查类、接口...

Global site tag (gtag.js) - Google Analytics