混淆点义
1.NOT FOUND
java.lang.NoClassDefFoundError是运行阶段无法加载到类
java.lang.ClassNotfoundException是编译阶段无法找到类
2.代理模式和装饰模式
代码类似,都是两个类实现同一个接口,一个类实际功能操作,传给另一个作为代理或是装饰的类;
功能不同,装饰旨在增加功能(不妨碍直接访问功能类的方法),代理则重在控制访问(会在访问功能类的方法中添加访问规则)
3.JDK动态代理:
-
定义代理对象接口以及代理对象实现
如:UserService userService = new UserServiceImpl();
-
实现InvocationHandler接口,将代理对象传入(其中Invoke方法可以实现代理功能//通过反射)
如:MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
-
根据目标对象生成代理对象(classLoader只要选对就行,加载普通类用的同一种classLoader)
如:UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(), invocationHandler); -
根据需要调用代理对象的方法
如:proxy.getXXX()
CGLib代理(针对目标类没有实现目标接口的代理):
动态生成子类,需要外部包,适合不频繁创建类的代理