一、简单实现:
package Demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class test1 {
public static void main(String[] args) {
Person p = new Student();
Class[] interfaces = {Person.class};
Person person = (Person) Proxy.newProxyInstance(test1.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("加油");
p.test();
p.love();
return null;
}
});
person.love();//根据内部写的方法显示结果,不论外部调用谁,结果一样
}
}
interface Person {
public void test();
public void love();
}
class Student implements Person{
@Override
public void test() {
// TODO Auto-generated method stub
System.out.println("努力努力再努力");
}
@Override
public void love() {
// TODO Auto-generated method stub
System.out.println("i love you ");
}
}
二、较复杂 动态代理的步骤:
1. 首先获得一个被代理对象的引用,
2. 获得该引用的接口
3. 生成一个类,这个类实现了我们给的代理对象所实现的接口
4. 上述类编译生成了.class字节码供JVM使用
5. 调用上述生成的class UserService.java 是接口 UserServiceImpl.java是被代理对象 实现了UserService ProxyTool.java 是代理类 Test.Java测试类
一、UserService.java
public interface UserService {
public void add();
}
二、UserServiceImpl.java
public class UserServiceImpl implements UserService{
public void add() {
// TODO Auto-generated method stub
System.out.println("hah");
}
}
三、 ProxyTool.java
public class ProxyTool implements InvocationHandler{
//被代理对象
Object targer ;
//增强类
Object advice ;
public ProxyTool(Object targer, Object advice) {
super();
this.targer = targer;
this.advice = advice;
}
public ProxyTool() {
super();
// TODO Auto-generated constructor stub
}
public Object getProxy() {
return Proxy.newProxyInstance(ProxyTool.class.getClassLoader(), targer.getClass().getInterfaces(),this) ;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Method[] m = advice.getClass().getMethods();
for (Method method2 : m) {
String name1 = method.getName();
String name2 = method2.getName();
if(name1.equals("add")) {
if(name2.equals("open")) {
method2.invoke(advice, args);
}
}
}
Object obj = method.invoke(targer, null);
return obj;
}
}
四、Test.Java
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ProxyTool tool = new ProxyTool( new UserServiceImpl(),new MyAdvice());
UserService proxy = (UserService) tool.getProxy();
proxy.add();
}
}
五、MyAdvice.java(用于增强)
public class MyAdvice {
public void open() {
System.out.println("open");
}
public void close() {
System.out.println("close");
}
}