Java反射机制,动态代理是基于什么原理?
反射机制是java中重要的一种基础功能,引入程序运行时自省的能力 。通过反射,可以直接操作类或者对象,如获取类的定义,获取类声明的属性和方法,调用方法,构造对象等。
动态代理是一种方便运行时构建代理,动态处理代理方法调用的机制,AOP面向切面编程就是利用类似的代理机制实现,实现动态代理的方式有以下几种:jdk自身提供的动态代理,cglib,javassist。
反射,引入运行时自省能力,赋予了Java语言额外的活力,通过运行时操作元数据或对象, Java可以灵活地操作运行时才能确定的信息。动态代理,是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。
JDK动态代理的例子:
public class MyProxy { public static void main( String[] args ) { HelloWorldImpl helloWorld = new HelloWorldImpl(); MyInvocationHandler handler = new MyInvocationHandler(helloWorld); //构造代码实例 HelloWorld proxyInstance = (HelloWorld) Proxy.newProxyInstance(HelloWorldImpl.class.getClassLoader(), HelloWorldImpl.class.getInterfaces(), handler);
/* newProxyInstanced的方法解析 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载 interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了 h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上 */ // 调用代理方法 proxyInstance.sayHello(); } } interface HelloWorld{ void sayHello(); } class HelloWorldImpl implements HelloWorld{ @Override public void sayHello() { System.out.println("helloworld"); } } //实现动态代理的接口 class MyInvocationHandler implements InvocationHandler{ private Object target; public MyInvocationHandler( Object target ) { this.target= target; } @Override public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable { System.out.println("动态代理 sayhello"); Object result = method.invoke(target, args); System.out.println(result+"====="); return result; } }
上面的JDK Proxy例子,非常简单地实现了动态代理的构建和代理操作。首先,实现对应的InvocationHandler;然后,以接口Helloworld为纽带,为被调用目标构建代理对象,进而应用程序就可以使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是println)提供了便利的入口