Proxy

package com.proxy;

public interface Moveable {
	public String run(String a,String b);

}


package com.proxy;

import java.util.Random;

public class Car implements Moveable {

	public String run(String a,String b) {
		try {
			Thread.sleep(new Random().nextInt(1000));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("running:"+a+"/"+b);
        return a+b;
	}

}

package com.proxy;

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

public class TimeInvocationHandler implements InvocationHandler {
	private Object target;
	

	public TimeInvocationHandler(Object target) {
		super();
		this.target = target;
	}


	/**
	 * arg0  代理对象
	 * arg1 代理方法
	 * arg2 代理方法参数
	 * return  代理方法返回
	 */
	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
		System.out.println("--time---");
		System.out.println(arg0.getClass().getName());
		System.out.println(target.getClass().getName());
		System.out.println("start");
		Object o = arg1.invoke(target,arg2);
		System.out.println("end");
		System.out.println(o.getClass().getName());
		System.out.println("--time---"+o);
		return o;
	}

}

package com.proxy;

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

public class LogInvocationHandler implements InvocationHandler {
	private Object target;
	

	public LogInvocationHandler(Object target) {
		super();
		this.target = target;
	}


	/**
	 * arg0  代理对象
	 * arg1 代理方法
	 * arg2 代理方法参数
	 * return  代理方法返回
	 */
	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
		System.out.println("--log---");
		System.out.println(arg0.getClass().getName());
		System.out.println(target.getClass().getName());
		System.out.println("log start");
		Object o = arg1.invoke(target,arg2);
		System.out.println("log end");
		System.out.println(o.getClass().getName());
		System.out.println("--log---"+o);
		return o;
	}

}

package com.proxy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;

public class Test {
	public static String getModifier(int modifier){
		  String result = "";
		  switch(modifier){
		   case Modifier.PRIVATE:
		    result = "private";
		   case Modifier.PUBLIC:
		    result = "public";
		   case Modifier.PROTECTED:
		    result = "protected";
		   case Modifier.ABSTRACT :
		    result = "abstract";
		   case Modifier.FINAL :
		    result = "final";
		   case Modifier.NATIVE :
		    result = "native";
		   case Modifier.STATIC :
		    result = "static";
		   case Modifier.SYNCHRONIZED :
		    result = "synchronized";
		   case Modifier.STRICT  :
		    result = "strict";
		   case Modifier.TRANSIENT :
		    result = "transient";
		   case Modifier.VOLATILE :
		    result = "volatile";
		   case Modifier.INTERFACE :
		    result = "interface";
		  }
		  return result;
		 }
		 
		 public static void printClassDefinition(Class clz){
		 
		  String clzModifier = getModifier(clz.getModifiers());
		  if(clzModifier!=null && !clzModifier.equals("")){
		   clzModifier = clzModifier + " ";
		  }
		  String superClz = clz.getSuperclass().getName();
		  if(superClz!=null && !superClz.equals("")){
		   superClz = "extends " + superClz;
		  }
		 
		  Class[] interfaces = clz.getInterfaces();
		 
		  String inters = "";
		  for(int i=0; i<interfaces.length; i++){
		   if(i==0){
		    inters += "implements ";
		   }
		   inters += interfaces[i].getName();
		  }
		 
		  System.out.println(clzModifier +clz.getName()+" " + superClz +" " + inters );
		  System.out.println("{");
		 
		  Field[] fields = clz.getDeclaredFields();
		  for(int i=0; i<fields.length; i++){
		   String modifier = getModifier(fields[i].getModifiers());
		   if(modifier!=null && !modifier.equals("")){
		    modifier = modifier + " ";
		   }
		   String fieldName = fields[i].getName();
		   String fieldType = fields[i].getType().getName();
		   System.out.println("    "+modifier + fieldType + " "+ fieldName + ";");
		  }
		 
		  System.out.println();
		 
		  Method[] methods = clz.getDeclaredMethods();
		  for(int i=0; i<methods.length; i++){
		   Method method = methods[i];

		   String modifier = getModifier(method.getModifiers());
		   if(modifier!=null && !modifier.equals("")){
		    modifier = modifier + " ";
		   }
		  
		   String methodName = method.getName();
		  
		   Class returnClz = method.getReturnType();
		   String retrunType = returnClz.getName();
		  
		   Class[] clzs = method.getParameterTypes();
		   String paraList = "(";
		   for(int j=0; j<clzs.length; j++){
		    paraList += clzs[j].getName();
		    if(j != clzs.length -1 ){
		     paraList += ", ";
		    }
		   }
		   paraList += ")";
		  
		   clzs = method.getExceptionTypes();
		   String exceptions = "";
		   for(int j=0; j<clzs.length; j++){
		    if(j==0){
		     exceptions += "throws ";
		    }

		    exceptions += clzs[j].getName();
		   
		    if(j != clzs.length -1 ){
		     exceptions += ", ";
		    }
		   }
		  
		   exceptions += ";";
		  
		   String methodPrototype = modifier +retrunType+" "+methodName+paraList+exceptions;
		  
		   System.out.println("    "+methodPrototype );
		  
		  }
		  System.out.println("}");
		 }

	public static void main(String[] args) {
		Car c = new Car();
		Class cl = c.getClass();
		TimeInvocationHandler tih = new TimeInvocationHandler(c);
         Moveable newProxyInstance1 = (Moveable) Proxy.newProxyInstance(cl.getClassLoader(), cl.getInterfaces(), tih);
         LogInvocationHandler lih = new LogInvocationHandler(newProxyInstance1);
         Moveable newProxyInstance = (Moveable) Proxy.newProxyInstance(cl.getClassLoader(), cl.getInterfaces(), lih);
         System.out.println(newProxyInstance.run("aaa","sss"));
        System.out.println("-----");
        printClassDefinition(newProxyInstance.getClass());
	}

}

--log---
com.sun.proxy.$Proxy0
com.sun.proxy.$Proxy0
log start
--time---
com.sun.proxy.$Proxy0
com.proxy.Car
start
running:aaa/sss
end
java.lang.String
--time---aaasss
log end
java.lang.String
--log---aaasss
aaasss
-----
com.sun.proxy.$Proxy0 extends java.lang.reflect.Proxy implements com.proxy.Moveable
{
    java.lang.reflect.Method m1;
    java.lang.reflect.Method m2;
    java.lang.reflect.Method m3;
    java.lang.reflect.Method m0;

    java.lang.String run(java.lang.String, java.lang.String);
    boolean equals(java.lang.Object);
    java.lang.String toString();
    int hashCode();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值