package javaenhance.src.cn.itcast.day3;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.util.ArrayList;

import java.util.Collection;

public class ProxyTest {

/**

* @param args

*/

public static void main(String[] args) throws Exception{

// TODO Auto-generated method stub

//接收两个参数,一个是后边参数的字节码的加载器,一个是所要实现代理的接口的字节码

Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);

System.out.println(clazzProxy1.getName());//打印代理的名字     $Proxy0

System.out.println("----------begin constructors list----------");

/*想打印出如下格式:

* $Proxy0()

$Proxy0(InvocationHandler,int)*/

Constructor[] constructors = clazzProxy1.getConstructors();//获取代理的构造函数

for(Constructor constructor : constructors){

String name = constructor.getName();//获取代理的构造函数的name

StringBuilder sBuilder = new StringBuilder(name);

sBuilder.append('(');

Class[] clazzParams = constructor.getParameterTypes();//获取代理的构造函数的参数

for(Class clazzParam : clazzParams){

sBuilder.append(clazzParam.getName()).append(',');

}

if(clazzParams!=null && clazzParams.length != 0)//稳妥的判断是否是一个参数,不是就删掉最后的,

sBuilder.deleteCharAt(sBuilder.length()-1);

sBuilder.append(')');

System.out.println(sBuilder.toString());    //$Proxy0(java.lang.reflect.InvocationHandler)

}

System.out.println("----------begin methods list----------");

/*$Proxy0()

$Proxy0(InvocationHandler,int)*/

Method[] methods = clazzProxy1.getMethods();//获取代理身上的方法

for(Method method : methods){

String name = method.getName();

StringBuilder sBuilder = new StringBuilder(name);

sBuilder.append('(');

Class[] clazzParams = method.getParameterTypes();

for(Class clazzParam : clazzParams){

sBuilder.append(clazzParam.getName()).append(',');

}

if(clazzParams!=null && clazzParams.length != 0)

sBuilder.deleteCharAt(sBuilder.length()-1);

sBuilder.append(')');

System.out.println(sBuilder.toString());

}

System.out.println("----------begin create instance object----------");

//Object obj = clazzProxy1.newInstance();

//方式一:通过接口的子类创建对象

Constructor constructor =

clazzProxy1.getConstructor(InvocationHandler.class);

//获取代理身上的构造函数

//创建内部类MyInvocationHandler1,目的是传递给代理的构造器

class MyInvocationHandler1 implements InvocationHandler{

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// TODO Auto-generated method stub

return null;

}

}

//方式二:匿名内部类

Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHandler1());

System.out.println(proxy1);//没有错误

proxy1.clear();//没有错误

//proxy1.size();报错,因为,代理调用size方法,其实是调用了MyInvocationHandler1中的invoke,他的返回值是null

//System.out.println("111111111111111");//调试用的

//用了匿名内部类的方法实现

Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

return null;

}

});

/*下边这部分代码非常重要和精辟*/

final ArrayList target = new ArrayList();

Collection proxy3 = (Collection)getProxy(target,new MyAdvice());

proxy3.add("zxx");

proxy3.add("lhm");

proxy3.add("bxd");

System.out.println(proxy3.size());

System.out.println(proxy3.getClass().getName());

}

private static Object getProxy(final Object target,final Advice advice) {

//方式三,newProxyInstance这个方法需要三个参数,可以直接创建target的代理对象

Object proxy3 = Proxy.newProxyInstance(

target.getClass().getClassLoader(),

/*new Class[]{Collection.class},*/

//获取target上的接口

target.getClass().getInterfaces(),

new InvocationHandler(){

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

/*long beginTime = System.currentTimeMillis();

Object retVal = method.invoke(target, args);

long endTime = System.currentTimeMillis();

System.out.println(method.getName() + " running time of " + (endTime - beginTime));

return retVal;*/

//把上边的代码封装到一个类中,让后调用该类的方法,就实现了方法的封装

advice.beforeMethod(method);

Object retVal = method.invoke(target, args);

advice.afterMethod(method);

return retVal;

}

}

);

return proxy3;

}

}

/*$Proxy0

----------begin constructors list----------

$Proxy0(java.lang.reflect.InvocationHandler)

----------begin methods list----------

hashCode()

equals(java.lang.Object)

toString()

add(java.lang.Object)

contains(java.lang.Object)

isEmpty()

size()

toArray()

toArray([Ljava.lang.Object;)

addAll(java.util.Collection)

iterator()

remove(java.lang.Object)

clear()

containsAll(java.util.Collection)

removeAll(java.util.Collection)

retainAll(java.util.Collection)

getProxyClass(java.lang.ClassLoader,[Ljava.lang.Class;)

newProxyInstance(java.lang.ClassLoader,[Ljava.lang.Class;,java.lang.reflect.InvocationHandler)

isProxyClass(java.lang.Class)

getInvocationHandler(java.lang.Object)

getClass()

notify()

notifyAll()

wait(long)

wait(long,int)

wait()

----------begin create instance object----------

null

到传智播客来学习啦!

从传智播客毕业上班啦!

add running time of 0

到传智播客来学习啦!

从传智播客毕业上班啦!

add running time of 0

到传智播客来学习啦!

从传智播客毕业上班啦!

add running time of 0

到传智播客来学习啦!

从传智播客毕业上班啦!

size running time of 0

3

$Proxy1*/

---------------------------------------------

import java.lang.reflect.Method;

public interface Advice {

void beforeMethod(Method method);

void afterMethod(Method method);

}

---------------------------------------------

package javaenhance.src.cn.itcast.day3;

import java.lang.reflect.Method;

//创建实现Advice接口的子类

public class MyAdvice implements Advice {

long beginTime = 0;

public void afterMethod(Method method) {

// TODO Auto-generated method stub

System.out.println("从传智播客毕业上班啦!");

long endTime = System.currentTimeMillis();

System.out.println(method.getName() + " running time of " + (endTime - beginTime));

}

public void beforeMethod(Method method) {

// TODO Auto-generated method stub

System.out.println("到传智播客来学习啦!");

beginTime = System.currentTimeMillis();

}

}

java 综合示例代码的更多相关文章

  1. 正则表达式学习笔记(附:Java版示例代码)

    具体学习推荐:正则表达式30分钟入门教程 .         除换行符以外的任意字符\w      word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s        space,空白符 ...

  2. JAVA SSM 示例代码

    SSM 即spring+spring mvc+mybatis,开发工具IDEA 1.先看下项目结构如图: 2.主要配置文件 spring-mvc.xml <?xml version=" ...

  3. kafka的Java客户端示例代码(kafka_2.11-0.8.2.2)

    1.使用Producer API发送消息到Kafka 从版本0.9开始被KafkaProducer替代. HelloWorldProducer.java package cn.ljh.kafka.ka ...

  4. kafka的Java客户端示例代码(kafka_2.12-0.10.2.1)

    使用0.9开始增加的KafkaProducer和KafkaConsumer. Pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  5. java封装示例代码

    package com.imooc; public class Telphone { private float screen; private float cpu; private float me ...

  6. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  7. Java Socket长连接示例代码

    SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...

  8. java 添加一个线程、创建响应的用户界面 。 演示示例代码

    javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章  部分的代码  夹21.2.11 thinking in java 4免费下载: ...

  9. 左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用

    文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy201 ...

随机推荐

  1. 新一代互联网传输协议QUIC浅析

    QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP.TLS.HTTP/2等协议的可靠性与安全性,可以有效减少 ...

  2. 超实用的Java数组技巧攻略分享!

    本文分享了关于Java数组最顶级的11大方法,帮助你解决工作流程问题,无论是运用在团队环境或是在私人项目中,你都可以直接拿来用! 声明一个数组(Declare an array) String[] a ...

  3. mac下的抓包工具Charles

    在mac下面,居然没有好的抓包工具,这让我十分纠结,毕竟不可能为了抓一个http包就跑到win下折腾.或许有人说tcpdump这么好的工具,你怎么不用.说实话,tcpdump太复杂了,我还没有细看,再 ...

  4. node写简单的爬虫(二)

    上次我们已经成功的爬取了网站上的图片,现在我们把爬取的图片存储到本地 首先引入request var request=require('request'); http.get(url, functio ...

  5. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  6. PHPCMS快速建站系列之标签调用出错

    {pc:content action="position" posid="24" order="listorder ASC" thumb=& ...

  7. JavaScript--for in循环访问属性用"."和[ ]的区别

    // for in 循环遍历对象的时候// 内部要访问属性的时候不能点语法访问,因为for in 的key是字符串格式// 可通过方括号实现访问 for(var key in manObj) { co ...

  8. 洛谷 P2568 GCD(莫比乌斯反演)

    题意:$\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)\epsilon prime]$. 对于这类题一般就是枚举gcd,可得: =$\sum_{d\epsilon prim ...

  9. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  10. Python基础:03序列:字符串、列表和元组

    一:序列 1:连接操作符(+) 这个操作符允许把一个序列和另一个相同类型的序列做连接,生成新的序列.语法如下:sequence1 + sequence2 该表达式的结果是一个包含sequence1和s ...