1.必须创建接口
关键:
使用 Proxy 类创建 代理类对象 (需要传入代理类对象,目标类装载类,目标类接口)
//返回一个指定接口的代理类实例(是一个接口对象)
Object o = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), // 目标类对象的装载类
UserServiceImpl.class.getInterfaces(), // 目标类接口
jdkProxy); //指派到指定的调用处理类对象
1.接口
package com.lt.test.service;
public interface UserService {
void func();
void func2();
}
2.实现类
package com.lt.test.service.impl;
import com.lt.test.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void func() {
System.out.println("目标类方法1");
}
@Override
public void func2() {
System.out.println("目标方法2");
}
}
3.代理类1
package com.lt.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//动态代理类
public class JDKProxy implements InvocationHandler {
private Object target;
//传入需要代理的目标对象
public JDKProxy(Object target) {
this.target = target;
}
//方法调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("func".equals(method.getName())){
System.out.println("before func");
Object result = method.invoke(target,args); //传入方法,参数,和目标对象
System.out.println("after func");
return result;
} else if("func2".equals(method.getName())){
System.out.println("before func2");
Object result = method.invoke(target,args); //传入方法,参数,和目标对象
System.out.println("after func2");
return result;
}
return null; //返回值
}
}
代理类2
package com.lt.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//动态代理类
public class JDKfun2Proxy implements InvocationHandler {
private Object target;
//传入需要代理的目标对象
public JDKfun2Proxy(Object target) {
this.target = target;
}
//方法调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before func2 JDKfun2Proxy");
Object result = method.invoke(target,args); //传入方法,参数,和目标对象
System.out.println("after func2 JDKfun2Proxy");
return result;
}
}
4.测试类
package com.lt.test;
import com.lt.test.proxy.JDKProxy;
import com.lt.test.proxy.JDKfun2Proxy;
import com.lt.test.service.UserService;
import com.lt.test.service.impl.UserServiceImpl;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class demo3 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
UserServiceImpl userService = new UserServiceImpl();
userService.func();
userService.func2();
JDKProxy jdkProxy = new JDKProxy(userService); //指派到指定的调用处理类对象。
//强类型转换调用
UserService userService1 = (UserService) Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), jdkProxy);
userService1.func();
userService1.func2();
//返回一个指定接口的代理类实例(是一个接口对象)
Object o = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), // 目标类对象的装载类
UserServiceImpl.class.getInterfaces(), // 目标类接口
jdkProxy); //指派到指定的调用处理类对象
System.out.println(o instanceof UserService);
//反射的方式去调用目标类方法
Class<?> aClass = o.getClass();
Method func = aClass.getDeclaredMethod("func");
func.setAccessible(true); //突破封装限制
Method func2 = aClass.getDeclaredMethod("func2");
func2.setAccessible(true); // 突破封装限制
func.invoke(o);
func2.invoke(o);
//其他代理类对象创建
JDKfun2Proxy jdKfun2Proxy = new JDKfun2Proxy(userService);
Object o1 = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), jdKfun2Proxy);
Class<?> aClass1 = o1.getClass();
Method func21 = aClass1.getDeclaredMethod("func2");
func21.setAccessible(true);
func21.invoke(o1);
}
}
输出