目录
关于内部类编译的问题
起因
由于昨天发了一个增量更新包,今早就发来"喜报",说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编译文件…血的教训换来一个知识点…