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