Java动态代理是Java语言的一种特性,通过使用动态代理技术可以在运行时创建代理类对象。这种代理机制常被用于AOP(面向切面编程)技术中。动态代理可以更加灵活地实现对目标对象的代理,无需显式地写出代理类。
Java动态代理的主要作用是在不修改原始类源代码的情况下为其创建代理类。该代理类可以通过在原始类方法的前后进行一些处理,来达到在原始类方法调用前后进行一些额外的逻辑。这对于日志和性能分析等需求来说是非常有用的。
动态代理可以完成以下两种方式的实现:
- JDK自带的动态代理:通过在运行时创建接口的实现类,实现对目标对象的代理。JDK动态代理只支持代理实现了接口的类。在创建代理对象时,需要为其传递一个invocation handler对象,该对象负责处理代理对象的方法调用。以下是一个JDK动态代理的示例代码:
public interface Animal {
void say();
}
public class Dog implements Animal {
public void say() {
System.out.println("汪汪汪");
}
}
public class AnimalHandler implements InvocationHandler {
private Object target;
public AnimalHandler(Object obj) {
this.target = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行方法前...");
Object result = method.invoke(target, args);
System.out.println("执行方法后...");
return result;
}
}
public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
AnimalHandler animalHandler = new AnimalHandler(dog);
Animal proxyAnimal = (Animal) Proxy.newProxyInstance(Dog.class.getClassLoader(), Dog.class.getInterfaces(), animalHandler);
proxyAnimal.say();
}
}
- CGLib动态代理:通过生成目标对象的子类来实现代理。在创建代理对象时,需要为其传递一个MethodInterceptor对象,该对象负责处理代理对象的方法调用。以下是一个CGLib动态代理的示例代码:
public class Person {
public void say(String msg) {
System.out.println(msg);
}
}
public class PersonInterceptor implements MethodInterceptor {
private Object target;
public PersonInterceptor(Object obj) {
this.target = obj;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("执行方法前...");
Object result = proxy.invoke(target, args);
System.out.println("执行方法后...");
return result;
}
}
public class Test {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Person.class);
enhancer.setCallback(new PersonInterceptor(new Person()));
Person proxyPerson = (Person) enhancer.create();
proxyPerson.say("你好!");
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是Java动态代理? - Python技术站