您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第15章:Java反射机制】_动态代理
发布时间:2021-01-07 17:19:04编辑:雪饮阅读()
普通的静态代理实现
package org.kasumi;
interface Subject{
public String say(String name,int age);
}
class RealSubject implements Subject{
public String say(String name ,int age){
return "姓名:"+name+",年龄:"+age;
}
}
class ProxySubject implements Subject{
private Subject sub=null;
public ProxySubject(Subject sub){
this.sub=sub;
}
public String say(String name,int age){
return this.sub.say(name,age);
}
}
public class Hello{
public static void main(String args[]){
Subject sub=new ProxySubject(new RealSubject());
System.out.println(sub.say("kasumi",24));
}
};
获取类加载器
class RealSubject{}
public class Hello{
public static void main(String args[]){
RealSubject r=new RealSubject();
System.out.println(r.getClass().getClassLoader().getClass().getName());
}
};
D:\>javac Hello.java
D:\>java Hello
sun.misc.Launcher$AppClassLoader
动态代理的实现
import java.lang.reflect.InvocationHandler ;
import java.lang.reflect.Proxy ;
import java.lang.reflect.Method ;
interface Subject{
public String say(String name,int age);
}
class RealSubject implements Subject{
public String say(String name,int age){
return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ;
public Object bind(Object obj){
this.obj = obj ; // 真实主题类
//一个对象的类加载器的类、一个对象所实现的所有接口、InvocationHandler实例
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this) ;
}
// 在执行方法之前执行
public void before() {
System.out.println("before kasumi");
}
//执行方法
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
this.before();
System.out.println("method: " + method);
System.out.println("args:");
for(Object x:args){
System.out.println("\tx:"+x);
}
Object temp = method.invoke(this.obj,args) ; // 调用方法
return temp ;
}
};
public class Hello{
public static void main(String args[]){
Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
String info = sub.say("kasumi",24) ;
System.out.println(info) ;
}
};
D:\>javac Hello.java
D:\>java Hello
before kasumi
method: public abstract java.lang.String Subject.say(java.lang.String,int)
args:
x:kasumi
x:24
姓名:kasumi,年龄:24
关键字词:java,动态代理