java 代理

This commit is contained in:
xiongraorao
2018-08-23 20:47:09 +08:00
parent 8ad4c408e4
commit 277362a6a1
7 changed files with 223 additions and 5 deletions

View File

@ -0,0 +1,56 @@
package com.raorao.java.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-23-20:31
*/
public class MyInvocationHandler implements InvocationHandler{
private Object object;
public MyInvocationHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("MyInvocationHandler invoke begin");
System.out.println("proxy: "+ proxy.getClass().getName());
System.out.println("method: "+ method.getName());
for(Object o : args){
System.out.println("arg: "+ o);
}
//通过反射调用 被代理类的方法
method.invoke(object, args);
System.out.println("MyInvocationHandler invoke end");
return null;
}
public static void main(String [] args){
//创建需要被代理的类
Student s = new Student();
//这一句是生成代理类的class文件前提是你需要在工程根目录下创建com/sun/proxy目录不然会报找不到路径的io异常
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
//获得加载被代理类的 类加载器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
//指明被代理类实现的接口
Class<?>[] interfaces = s.getClass().getInterfaces();
// 创建被代理类的委托类,之后想要调用被代理类的方法时都会委托给这个类的invoke(Object proxy, Method method, Object[] args)方法
MyInvocationHandler h = new MyInvocationHandler(s);
//生成代理类
Person proxy = (Person) Proxy.newProxyInstance(loader, interfaces, h);
//通过代理类调用 被代理类的方法
proxy.sayHello("yujie.wang", 20);
proxy.sayGoodBye(true, 100);
System.out.println("end");
}
}

View File

@ -0,0 +1,14 @@
package com.raorao.java.proxy;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-23-20:27
*/
public interface Person {
public void sayHello(String content, int age);
public void sayGoodBye(boolean seeAgin, double time);
}

View File

@ -0,0 +1,48 @@
package com.raorao.java.proxy;
/**
* 静态代理测试.
*
* @author Xiong Raorao
* @since 2018-08-23-20:29
*/
public class StaticProxyTest implements Person {
private Person o;
public StaticProxyTest(Person o) {
this.o = o;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//s为被代理的对象某些情况下 我们不希望修改已有的代码,我们采用代理来间接访问
Student s = new Student();
//创建代理类对象
StaticProxyTest proxy = new StaticProxyTest(s);
//调用代理类对象的方法
proxy.sayHello("welcome to java", 20);
System.out.println("******");
//调用代理类对象的方法
proxy.sayGoodBye(true, 100);
}
@Override
public void sayHello(String content, int age) {
// TODO Auto-generated method stub
System.out.println("ProxyTest sayHello begin");
//在代理类的方法中 间接访问被代理对象的方法
o.sayHello(content, age);
System.out.println("ProxyTest sayHello end");
}
@Override
public void sayGoodBye(boolean seeAgin, double time) {
// TODO Auto-generated method stub
System.out.println("ProxyTest sayHello begin");
//在代理类的方法中 间接访问被代理对象的方法
o.sayGoodBye(seeAgin, time);
System.out.println("ProxyTest sayHello end");
}
}

View File

@ -0,0 +1,20 @@
package com.raorao.java.proxy;
/**
* .
*
* @author Xiong Raorao
* @since 2018-08-23-20:28
*/
public class Student implements Person {
@Override
public void sayHello(String content, int age) {
System.out.println("student say hello" + content + " " + age);
}
@Override
public void sayGoodBye(boolean seeAgin, double time) {
System.out.println("student sayGoodBye " + time + " " + seeAgin);
}
}