zoukankan      html  css  js  c++  java
  • 688笔记

    反射

    /**
     * 反射
     */
    public class Test {
        public static ReflectServiceImpl getInstance(){
            ReflectServiceImpl obj = null;
            try {
                //getConstructor 获取构造函数
                //newInstance 实例化
                obj = (ReflectServiceImpl) Class.forName("proxy.demo.ReflectServiceImpl").getConstructor(String.class).newInstance("张三");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return obj;
        }
        public static void main(String[] args){
            ReflectServiceImpl instance = getInstance();
            instance.sayHello();
        }
    }
    
    

    动态代理:略

    • jdk implements InvocationHandler
    • cglib implements MethodInterceptor

    jdk动态代理实现拦截器

    public interface Interceptor {
        public boolean before(Object proxy, Object target, Method method, Object[] args);
    
        public void around(Object proxy, Object target, Method method, Object[] args);
    
        public void after(Object proxy, Object target, Method method, Object[] args);
    }
    
    public class MyInterceptor implements Interceptor {
        @Override
        public boolean before(Object proxy, Object target, Method method, Object[] args) {
            System.out.println("反射before...");
            return true;//返回true执行原有方法
        }
    
        @Override
        public void around(Object proxy, Object target, Method method, Object[] args) {
            System.out.println("不执行原有方法,执行代理方法");
        }
    
        @Override
        public void after(Object proxy, Object target, Method method, Object[] args) {
            System.out.println("反射after...");
        }
    }
    
    public class InterceptorJdkProxy implements InvocationHandler {
        private Object target;
        private String interceptorClass = null;
    
        public InterceptorJdkProxy(Object target,String interceptorClass){
            this.target = target;
            this.interceptorClass = interceptorClass;
        }
    
        public static Object getInstance(Object target,String interceptorClass){
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    new InterceptorJdkProxy(target,interceptorClass));
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (interceptorClass==null){
                //没有拦截器,执行原有方法
                return method.invoke(target,args);
            }
            Object result = null;
            Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();
            if (interceptor.before(proxy,target,method,args)){
                //执行原有方法
                result = method.invoke(target,args);
            }else {
                //执行拦截方法
                interceptor.around(proxy,target,method,args);
            }
            interceptor.after(proxy,target,method,args);
            return result;
        }
    }
    
    public class Test {
        public static void main(String[] args){
            Inter inter = (Inter) InterceptorJdkProxy.getInstance(new Boss(),"proxy.Interceptor.MyInterceptor");
            inter.findPerson();
        }
    }
    

    观察者模式实例:通过java.util.Observer实现

    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Observable;
    import java.util.Observer;
    
    public class ProductList extends Observable {
        private List<String> productList = null;
        private static ProductList instance;
        private ProductList(){}
    
        public static ProductList getInstance(){
            if (instance == null){
                instance = new ProductList();
                instance.productList = new ArrayList<>();
            }
            return instance;
        }
    
        public void addProductListObserver(Observer observer){
            this.addObserver(observer);
        }
        public void addProduct(String newProduct){
            productList.add(newProduct);
            System.out.println("新增产品"+newProduct);
            this.setChanged();//设置被观察对象发生变化
            this.notifyObservers(newProduct);//通知观察者
        }
    }
    
    import java.util.Observable;
    import java.util.Observer;
    
    public class Observer1 implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            String newProduct = (String) arg;
            System.out.println("有新产品了:"+newProduct);
        }
    }
    
    public class Test {
        public static void main(String[] args){
            ProductList instance = ProductList.getInstance();
            Observer1 observer1 = new Observer1();
            Observer2 observer2 = new Observer2();
            instance.addProductListObserver(observer1);
            instance.addProductListObserver(observer2);
            instance.addProduct("新增xxx");
        }
    }
    
  • 相关阅读:
    5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
    一本通 高手训练 1782 分层图 状压dp
    luogu P3830 [SHOI2012]随机树 期望 dp
    5.2 省选模拟赛 或许 线型基
    luogu P4562 [JXOI2018]游戏 组合数学
    一本通 高手训练 1781 死亡之树 状态压缩dp
    luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
    4.28 省选模拟赛 负环 倍增 矩阵乘法 dp
    HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内
    一本通 高手训练 1763 简单树 可持久化线段树 树链刨分 标记永久化
  • 原文地址:https://www.cnblogs.com/fly-book/p/10414734.html
Copyright © 2011-2022 走看看