反射和动态代理

简单总结——

反射:反射的重点在于runtime阶段的获取类信息和调用类方法,那么当你的编码过程中中有“部分信息是source阶段不清晰,需要在runtime阶段动态临时加载”这种场景,反射就可以派上用场了
https://www.jianshu.com/p/9d13a9eeccdf

应用场景:

  • 反编译
  • 通过XML或properties装在bean
  • AOP

https://www.cnblogs.com/gonjan-blog/p/6685611.html
静态代理:有个公共接口,还有实体类,和代理实体类(持有实体类实例)

动态代理:首先写一个实现了InvocationHandler接口的类,然后将所代理类对象作为构造参数传进去。
然后用被代理类和这个handler new出ProxyInstance出来。最后调用代理方法就行。
https://blog.csdn.net/zpf336/article/details/82751925
InvocationHandler中有一个invoke方法,所有执行代理对象的方法都会被替换成执行invoke方法

public class MyDynamicProxy {
public static void main (String[] args) {
HelloImpl hello = new HelloImpl();
MyInvocationHandler handler = new MyInvocationHandler(hello);
// 构造代码实例
Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), new class[]{Hello.class},handler);
// 调用代理方法
proxyHello.sayHello();
}
}
interface Hello {
void sayHello();
}
class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
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("Invoking sayHello");
Object result = method.invoke(target, args);
return result;
}
}
 /**
     * proxy:代表动态代理对象
     * method:代表正在执行的方法
     * args:代表调用目标方法时传入的实参
     */
invoke(Object proxy, Method method, Object[] args)

从 API 设计和实现的角度,这种实现仍然有局限性,因为它是以接口为中心的,相当于添加了一种对于被调用者没有太大意义的限制。我们实例化的是 Proxy 对象,而不是真正的被调用类型,这在实践中还是可能带来各种不便和能力退化。
如果被调用者没有实现接口,而我们还是希望利用动态代理机制,那么可以考虑其他方式。
我们知道 Spring AOP 支持两种模式的动态代理,JDK Proxy 或者 cglib,如果我们选择 cglib 方式,你会发现对接口的依赖被克服了。
cglib 动态代理采取的是创建目标类的子类的方式,因为是子类化,我们可以达到近似使用被调用者本身的效果。

AOP 编程就是基于动态代理实现的,比如著名的 Spring 框架、 Hibernate 框架等等都是动态代理的使用例子。


静态动态代理区别:

静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。

静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

业务类必须要实现接口,通过 Proxy 里的 newProxyInstance 得到代理对象。

你可能感兴趣的:(源码)