我的java学习笔记(19)关于代理

1.利用代理可以在运行时创建一个实现了一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。

2.调用处理器是实现了InvacationHandler接口的类对象。

3.无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。调用处理器必须给出处理调用的方式。

4.想要创建一个代理对象,需要使用Proxy类的newProxyInstance方法。

该方法的三个参数:

a.一个类加载器

b.一个Class对象数组

c.一个调用处理器。

5.无论何时用Proxy调用某个方法,这个方法的名字和参数就会打印出来,之后再用value调用它。

6.代理类实在程序运行时创建的,一旦被创建,就变成了常规类,与虚拟机中的任何其他类没有什么区别。

7.所有的代理类都扩展于Proxy类。一个代理类只有一个实例域即调用处理器,它定义在Proxy的超类中。

8.为了履行代理对象的职责,所需要的任何附加数据都必须存储在调用处理器中。

9.所有的代理类都覆盖了Object类中的方法toString、hashCode和equals。Object类中的其他方法没有被重新定义。

10.没有定义代理类的名字,Sun虚拟机中的Proxy类将生产一个以字符串$Proxy开头的类名。

11.对于特定的类加载器和预设的一组接口来说,只能有一个代理类。

12.代理类一定是public和final的。

13.可以通过调用Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类。

实例代码

测试类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Random;

public class test {
	public static void main(String[] args)
	{
		Object[] ele = new Object[1000];
		for(int i = 0;i < ele.length;i++)
		{
			Integer value = i + 1;
			InvocationHandler handler = new TraceHandler(value);
			Object proxy = Proxy.newProxyInstance(null, new Class[]{Comparable.class}, handler);
			ele[i] = proxy;
		}

		Integer key = new Random().nextInt(ele.length) + 1;
		int result = Arrays.binarySearch(ele, key);

		if(result >= 0)
			System.out.println(ele[result]);

	}
}

功能类

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

public class TraceHandler implements InvocationHandler {

	private Object target;

	public TraceHandler(Object t)
	{
		target = t;
	}

	public Object invoke(Object proxy,Method m,Object[] args) throws Throwable
	{
		System.out.print(target);
		System.out.print("." + m.getName() + "(");
		if(args != null)
		{
			for(int i = 0;i < args.length;i++)
			{
				System.out.print(args[i]);
				if(i < args.length - 1)
					System.out.print(",");
			}
		}
		System.out.println(")");

		return m.invoke(target,args);
	}

}

输出结果

时间: 2024-08-27 02:04:13

我的java学习笔记(19)关于代理的相关文章

java学习笔记14--动态代理

java学习笔记14--动态代理 InvocationHandler接口 [java] view plaincopy public interface InvocationHandler{ public Object invoke(Object proxy,Method method,Object[] args)throws Throwable } 参数说明: Object  proxy:被代理的对象 Method  method:要调用的方法 Object   args[]:方法调用时所需要的

Java学习笔记——设计模式之四.代理模式

To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: 1 package cn.no4.proxy; 2 3 public interface IMakeMoney { 4 5 void makeMoney(); 6 } 1 package cn.no4.proxy; 2 3 public class Proxy implements IMakeMoney { 4

Java学习笔记19

Objects是Java 7新增的一个工具类,它提供了一些工具方法来操作对象,这些工具方法大多是"空指针"安全的. Objects实现的方法如下: (1)hasCode(Object)方法在源码中是如何实现的: public static int hashCode(Object o) { return o != null ? o.hashCode() : 0; } 原来在hasCode(Object)方法中多做了一层判断,如果这个对象为null 的话,就返回一个int型的0给它,相反这

java学习笔记-设计模式9(代理模式)

意图 为其他对象提供一种代理以控制对这个对象的访问. public interface Sourceable { public void method(); } public class Source implements Sourceable{ @Override public void method() { System.out.println("this is original method!"); } } public class Proxy implements Source

Java学习笔记——动态代理

所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记--RMI"中的远程代理,其中客户端服务对象就是一个远程服务对象的代理,这个代理可以使得客户在操作时感觉像在操作本地对象一样,远程对象对于客户是透明的.我们可以看出这里的远程代理,是在程序中事先写好的,而本节我们要讨论的远程代理,是由JVM根据反射机制,在程序运行时动态生成的.(以上是本人的理解,如果有不正确的地

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

java学习笔记14--多线程编程基础1

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂 多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep