1.申明目标接口:
public interface Subject {
void request();
void hello();
}
2.申明目标类,实现目标接口:
public class RealClass implements Subject {
@Override
public void request() {
System.out.println("request----");
}
@Override
public void hello() {
System.out.println("hello=======----");
}
}
3.申明处理器对象:并非代理对象
package pers.lish.girl.aoplearning.dynamicproxy_jdk;
import pers.lish.girl.aoplearning.staticproxy.RealClass;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 类似aspect注解---动态获取反射方法----接口实现
* create by luofeng on 2017-12-22 16:14
*/
public class JdkSubject implements InvocationHandler {
private RealClass realClass;
/**
* 引用真实实现类
* @param realClass
*/
public jdkSubject ( RealClass realClass){
this.realClass=realClass;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前执行-===---------------");
Object result=null;
try {
//动态获取对象,动态传参
result = method.invoke(realClass, args);
} catch (Exception e) {
System.out.println("错误:-----"+e.getMessage());
System.out.println("代理类不能改变实际的逻辑执行,所以异常要抛出");
throw e;
} finally {
System.out.println("代理后执行----------------");
}
return result;
}
}
4.测试类:
package pers.lish.girl.aoplearning.dynamicproxy_jdk;
import pers.lish.girl.aoplearning.staticproxy.RealClass;
import pers.lish.girl.aoplearning.staticproxy.Subject;
import java.lang.reflect.Proxy;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
/**
* create by lishengbo on 2017-12-22 16:21
* 优点:
* 代码简洁易读
* public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
*/
public class JDKTest {
public static void main(String[] args) {
//设置将代理类生成出来 jdk>8使用
//jdk<=8 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
System.setProperty("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
//1.创建目标对象
RealClass realClass = new RealClass();
//2.创建调用处理器对象
JdkSubject jdkSubject = new JdkSubject();
//3.动态生成代理对象 new Class[]{Subject.class} 也可以换成 SubjectImpl.class.getInterfaces()
Subject subject= (Subject) Proxy.newProxyInstance(JDKTest.class.getClassLoader(),new Class[]{Subject.class},jdkSubject);
//4.查看代理对象名称:com.sun.proxy.$Proxy0 //和代理对象父类名称
System.out.println(subject.getClass().getName());
System.out.println(subject.getClass().getSuperclass().getName());
//5.客户端通过代理对象调用方法
//本次调用将自动被代理处理器的invoke方法接收
subject.request();
subject.hello();
}
}
5.打开代理类,查看执行过程: