二、静态代理
public interface Girl {
public void behavior();
}
//然后让美女类实现这个接口
public class NiceGirl implements Girl {
private String name;
public NiceGirl(String name){
this.name = name;
}
@Override
public void behavior() {
System.out.println(this.name+"长的非常nice");
System.out.println(this.name+"说话也非常nice");
}
}
public class GirlAgent implements Girl {
private Girl girl;
public GirlAgent(Girl girl) {
super();
this.girl = girl;
}
@Override
public void behavior() { //增强方法
Random rand = new Random();
if(rand.nextBoolean())
{
System.out.println("我安排你们上自习");
girl.behavior();
}
else{
System.out.println("先看你的表现,上自习以后再说");
}
}
//目标类,代理类要增强的类
public class SomeServiceImpl implements ISomeService {
@Override
public String doFirst() {
System.out.println("执行doFirst");
return "aaa";
}
@Override
public void doSecond() {
System.out.println("执行doSecond");
}
}
public class MyTest {
public static void main(String[] args) {
/*参数一loader:目标类的类加载器
**参数二Interfaces:目标类所实现的所有接口
* *参数三:匿名内部类,在内部增强方法 */
ISomeService target = new SomeServiceImpl();
//由Proxy类的newProxyInstance()生成一个动态代理对象
ISomeService service = (ISomeService) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //得到类加载器
target.getClass().getInterfaces(), //得到类实现的接口
new InvocationHandler() {
@Override //proxy:代理对象
//method:增强方法,在调用方法的时候自动获得
//Object[] args:目标方法的参数列表,调用方法自动获得
//对方法进行了增强
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args); //invoke表示执行方法
if(result!=null){ //对原方法的结果进行修饰,完成对原方法的加强
result = ((String)result).toUpperCase();
} return result;
//原方法的返回值不能为空
}
});
String result = service.doFirst();//这个方法返回值就是invoke方法返回值
System.out.println(result); }}
}
}
}
}
}
//目标类,没有实现任何接口
public class SomeService {
public String doFirst(){
System.out.println("正在执行doFirst方法");
return "adad";
}
public void doSecond(){
System.out.println("正在执行doSecond方法");
}
}
//原理,先决定目标类,再执行增强方法
public class CGLIBFactory implements MethodInterceptor {
private SomeService target;
private Enhancer enhancer = new Enhancer();
public CGLIBFactory() {
super();
}
public CGLIBFactory(SomeService target) {
super();
this.target = target;
}
public SomeService myCglibCreater(){
/*增强原理:子类增强了父类
* cglib创建的是目标类的子类对象
* 指定父类,即目标类
*/
enhancer.setSuperclass(SomeService.class);
//设置回调接口对象(实现callback接口的对象)
//MethodInterceptor继承了callback
//当执行完目标类的方法的时候会自动调用接口方法
enhancer.setCallback(this);
//create()用于创建cglib动态代理对象
return (SomeService) enhancer.create();
}
//回调接口的方法
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
Object invoke = method.invoke(target, args);
if(invoke !=null){
invoke = ((String)invoke).toUpperCase();
}
return invoke;
}
}