java 代理
This commit is contained in:
@ -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");
|
||||
}
|
||||
|
||||
}
|
14
code/src/main/java/com/raorao/java/proxy/Person.java
Normal file
14
code/src/main/java/com/raorao/java/proxy/Person.java
Normal 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);
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
20
code/src/main/java/com/raorao/java/proxy/Student.java
Normal file
20
code/src/main/java/com/raorao/java/proxy/Student.java
Normal 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user