在Java中,可以使用動態(tài)代理技術來動態(tài)實現(xiàn)接口的方法。動態(tài)代理是一種設計模式,它允許在運行時創(chuàng)建一個實現(xiàn)特定接口的代理類。
Java中實現(xiàn)動態(tài)代理的方式有兩種:基于接口的動態(tài)代理和基于類的動態(tài)代理。
下面是一個示例代碼:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface HelloWorld {
void sayHello();
}
class HelloWorldImpl implements HelloWorld {
@Override
public void sayHello() {
System.out.println("Hello World!");
}
}
class HelloWorldProxy implements InvocationHandler {
private Object target;
public HelloWorldProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoking sayHello method");
Object result = method.invoke(target, args);
System.out.println("After invoking sayHello method");
return result;
}
}
public class Main {
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorldImpl();
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
HelloWorld.class.getClassLoader(),
new Class[]{HelloWorld.class},
new HelloWorldProxy(helloWorld));
proxy.sayHello();
}
}
下面是一個示例代碼:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class HelloWorld {
public void sayHello() {
System.out.println("Hello World!");
}
}
class HelloWorldInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before invoking sayHello method");
Object result = proxy.invokeSuper(obj, args);
System.out.println("After invoking sayHello method");
return result;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(HelloWorld.class);
enhancer.setCallback(new HelloWorldInterceptor());
HelloWorld proxy = (HelloWorld) enhancer.create();
proxy.sayHello();
}
}
無論是基于接口的動態(tài)代理還是基于類的動態(tài)代理,都可以在代理對象中實現(xiàn)對接口方法的動態(tài)處理。