Java动态代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java动态代理相关的知识,希望对你有一定的参考价值。

Java动态代理
在讲解java代理时先讲解一下java的反射,这里讲解的java反射是针对于方法并且简单的介绍。
对于java反射,可以使用Class.forName(package + “.”+className)来获取Class类。通过Class类可以获取对于的java类型的方法,也可以通过实例化的getClass来获取Class对象。其中如下:
getMethod(String name,Class<?>…param)表示通过方法名称,参数来获取对应的public方法
getMethods()表示获取publicd的方法
getDeclaredMethod(String name, Class<?>... para)表示通过方法名称,参数来获取public,procted,private方法
getDeclaredMethods()获取所有的方法

对于java的代理,有两个重要的类,分别是:Proxy和InvocationHandler。
其中InvocationHandler是自己定义的代理类需要实现的接口。其中要实现的方法是
Object invoke(Object proxy, Method method, Object[] args)throws Throwable
Proxy表示的时自定定义的代理的对象,method表示调用的方法,args表示调用的方法需要传入的参数。
Proxy中有一个静态的方法
Public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader表示自定义的代理的ClassLoader。可以通过Class 中getClassLoader()来获取
interfaces表示接口,使用Class中的getInterfaces()类获取,h是InvocationHandler的实例化,就是自定义的代理类。
以下是实例:
自定义的代理:
package cn.com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DyProxy implements InvocationHandler {
private Object obj;
public DyProxy(Object obj) {
this.obj = obj;br/>}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
System.out.println("调用的方法: " + arg1.getName());
System.out.println("调用的类名: " + obj.getClass().getName());
System.out.println("arg0 " + arg0.getClass().getName());
return arg1.invoke(obj, arg2);
}
}
定义的接口:
package cn.com.proxy.service.api;
public interface StudentService {
public String getStudent();
}
实现的接口定义:
package cn.com.proxy.service.impl;
import cn.com.proxy.service.api.StudentService;
public class StudentServiceImpl implements StudentService {
br/>@Override
public String getStudent() {
System.out.println("getStudent");
return "sucess";
}
}
执行类:
package cn.com.proxy;
import java.lang.reflect.Proxy;
import cn.com.proxy.service.api.StudentService;
import cn.com.proxy.service.impl.StudentServiceImpl;
public class TestMain {
public static void main(String[] args) throws ClassNotFoundException {
//创建自己定义的借口实例
StudentService student = new StudentServiceImpl();
Class cls = Class.forName("cn.com.proxy.service.impl.StudentServiceImpl");
System.out.println(cls.getName() + " ============================ ");
//实例化自己定义的代理对象
DyProxy instance = new DyProxy(student);
//进行代理
StudentService sub = (StudentService) Proxy.newProxyInstance(instance.getClass().getClassLoader(),
student.getClass().getInterfaces(), instance);
//在代理的情况下调用方法
sub.getStudent();
}
}



以上是关于Java动态代理的主要内容,如果未能解决你的问题,请参考以下文章

动态代理

Java 方法代理实例操作,静态代理JDK动态代理CGLIB动态代理

Java动态代理

Java动态代理

java-动态代理

Java 动态代理