1、java是一种静态(编译时检查)强类型(不同类型赋值需要转化)的语言,部分动态语言类型的能力,比如反射机制
2、实现动态代理的方式:jdk自带的实现,asm,cglib(基于asm),javassist等
3、java反射:通过运行时操作对象,灵活处理运行时才能确定的信息
4、动态代理:很多重复的繁琐的编程,可以使用动态代理去解决
5、应用场景:比如java类,运行时自动生成get,set方法,不需要开发重复写代码,accessible可以修改成员的访问权限(public,protected,private)
6、代理可以看作是对调用目标的一个封装,对目标的调用不直接发生,通过代理完成,实现调用者和实现者的解耦
7、java动态代理的例子
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(), HelloImpl.class.getInterfaces(), 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;
}
}
8、AOP 通过(动态)代理机制可以让开发者从这些繁琐事项中抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如 Facade、Observer 等很多设计目的,都可以通过动态代理优雅地实现。日志,事务,权限,异常处理
9、选型需要考虑的因素:
性能、可靠性,可维护性,编程的工作量