关于Java中内部类编译的问题

关于内部类编译的问题

起因

由于昨天发了一个增量更新包,今早就发来"喜报",说XX模块功能有问题,于是在下去生产排查后,发现是内部类的问题,在下心想可能是昨天增量包缺少类.
Java中只能有一个public class 类,但是public class类内部可以有若干个public class类,就是所谓的内部类.如下代码中有两个内部类 Consumer和Provider

public class VoucherConsumerThread {
    private VoucherSubjectProduce voucherSubjectProduce = new VoucherSubjectProduce();
    Log log = new Log(VoucherConsumerThread.class);

    public static void main(String[] args) throws InterruptedException {
        VoucherConsumerThread voucherConsumerThread = new VoucherConsumerThread();
        VoucherConsumer voucherConsumer = voucherConsumerThread.new VoucherConsumer();
        Thread thread = new Thread(voucherConsumer);
        thread.start();

        Thread.sleep(2000);

        Provider provider = voucherConsumerThread.new Provider();
//        provider.provider();
        VoucherSubject vs = new VoucherSubject();
        provider.provider(vs);
    }


     //内部类VoucherConsumer
     public class VoucherConsumer implements Runnable {
        @Override
        public void run() {
            consumer();
        }

        private void consumer() {
            try{
                while (true){
                    VoucherQueueHolder.lock.lock();
                    while(VoucherQueueHolder.queue.size() == 0){
                        log.info("队列空,等待凭证数据......size:"+VoucherQueueHolder.queue.size());
                        VoucherQueueHolder.notEmpty.await();
                    }

                    VoucherSubject vs = VoucherQueueHolder.queue.poll();
                    log.info("从队列中取出一个消费数据....."+vs);
                    voucherSubjectProduce.callSubjectMoneyProduce(vs.getAccUuid());
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                VoucherQueueHolder.lock.unlock();
            }

        }
    }


	//内部类Provider
    public class Provider{

        public void provider(VoucherSubject vs){
            VoucherQueueHolder.lock.lock();
            try {
                VoucherQueueHolder.queue.add(vs);
                VoucherQueueHolder.notEmpty.signalAll();
                log.info("队列添加了一条数据,size:"+VoucherQueueHolder.queue.size());
            }finally {
                VoucherQueueHolder.lock.unlock();
            }

        }


    }


}

上面的代码存在VoucherConsumerThread.java文件中, 起初我以为编译也只会是一个文件VoucherConsumerThread.class, 结果在下的无知导致生产直接报错,classNotFound…生产环境boom.
内部类以$符号标记
从图中可以看到VoucherConsumerThread.java文件编译后是三个class文件…所以在下的增量更新包中是少发了两个内部类的class编译文件…血的教训换来一个知识点…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值