23.反射_构造器,获取继承关系

本文介绍了Java中如何通过Class对象获取构造方法(构造器)和继承关系,包括getConstructor(), getSuperclass(), 和 isAssignableFrom() 方法的应用。实例演示了如何创建对象并判断向上转型。

Java教程 - 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程icon-default.png?t=M0H8https://www.liaoxuefeng.com/wiki/1252599548343744

1.获取构造方法(构造器)

通过Class实例获取Constructor的方法如下:

  • getConstructor(Class...):获取某个 public Constructor
  • getDeclaredConstructor(Class...):获取某个 Constructor
  • getConstructors():获取所有 public Constructor
  • getDeclaredConstructors():获取所有 Constructor

注意 Constructor总是当前类定义的构造方法,和父类无关,因此不存在多态的问题。

调用非 public Constructor时,必须首先通过 setAccessible(true)设置允许访问。 setAccessible(true)可能会失败。

小结

Constructor对象封装了构造方法的所有信息;

通过 Class实例的方法可以获取 Constructor实例: getConstructor() getConstructors() getDeclaredConstructor() getDeclaredConstructors()

通过 Constructor实例可以创建一个实例对象: newInstance(Object... parameters); 通过设置 setAccessible(true)来访问非 public构造方法。

import java.lang.reflect.Constructor;

public class Constructi {

        public static void main(String[] args) throws Exception {

            // 获取构造方法Integer(int):

            Constructor cons1 = Integer.class.getConstructor(int.class);

            // 调用构造方法:

            Integer n1 = (Integer) cons1.newInstance(123);

            System.out.println(n1);

            // 获取构造方法Integer(String)

            Constructor cons2 = Integer.class.getConstructor(String.class);

            Integer n2 = (Integer) cons2.newInstance("456");

            System.out.println(n2);

        }

}

输出:

123

456

2.获取继承关系

public class ExtendsTest {
        public static void main(String[] args) throws Exception {
            Class i = Integer.class;
            Class n = i.getSuperclass();
            System.out.println(n);
            Class o = n.getSuperclass();
            System.out.println(o);
            System.out.println(o.getSuperclass());

            Class s = Integer.class;
        Class[] is = s.getInterfaces();
            for (Class i1 : is) {
                System.out.println(i1);
             }

}
}

输出:
 
 

class java.lang.Number

class java.lang.Object

null

interface java.lang.Comparable

Object n = Integer.valueOf(123);
boolean isDouble = n instanceof Double; // false
boolean isInteger = n instanceof Integer; // true
boolean isNumber = n instanceof Number; // true
boolean isSerializable = n instanceof java.io.Serializable; // true
 

两个 Class实例,要判断一个向上转型是否成立,可以调用 isAssignableFrom()

// Integer i = ?
Integer.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Integer
// Number n = ?
Number.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Number
// Object o = ?
Object.class.isAssignableFrom(Integer.class); // true,因为Integer可以赋值给Object
// Integer i = ?
Integer.class.isAssignableFrom(Number.class); // false,因为Number不能赋值给Integer

小结

通过 Class对象可以获取继承关系:

  • Class getSuperclass():获取父类类型;
  • Class[] getInterfaces():获取当前类实现的所有接口。

通过 Class对象的 isAssignableFrom()方法可以判断一个向上转型是否可以实现。

import sys import cv2 import threading from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QCheckBox, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QFileDialog) from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import Qt, pyqtSignal, QObject import pyzbar.pyzbar as pyzbar from paddleocr import PaddleOCR class CameraThread(QObject): image_signal = pyqtSignal(QImage) result_signal = pyqtSignal(str) ocr_signal = pyqtSignal(str) def __init__(self): super().__init__() self.cap = None self.running = False self.ocr = PaddleOCR(use_angle_cls=True, lang='ch') self.last_qr_position = None def start_camera(self): self.cap = cv2.VideoCapture(0) if not self.cap.isOpened(): self.result_signal.emit("摄像头打开失败!") return self.running = True while self.running: ret, frame = self.cap.read() if not ret: continue # 转换为Qt可显示的格式 rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape bytes_per_line = ch * w qt_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) self.image_signal.emit(qt_image) # 检查是否需要进行识别 if self.running: self.process_frame(frame) def process_frame(self, frame): # 传统方法解码 if self.traditional_method: results = pyzbar.decode(frame) if results: for obj in results: data = obj.data.decode("utf-8") self.result_signal.emit(f"传统方法: {data}") self.last_qr_position = obj.polygon # 如果启用了OCR,启动OCR线程 if self.ocr_enabled: threading.Thread(target=self.run_ocr, args=(frame, obj.polygon)).start() return # AI检测方法 (这里简化为传统方法,实际项目中可使用深度学习模型) if self.ai_detection: # 在实际应用中,这里应该替换为AI模型推理代码 results = pyzbar.decode(frame) if results: for obj in results: data = obj.data.decode("utf-8") self.result_signal.emit(f"AI检测: {data}") self.last_qr_position = obj.polygon if self.ocr_enabled: threading.Thread(target=self.run_ocr, args=(frame, obj.polygon)).start() return def run_ocr(self, frame, qr_position): try: # 获取二维码周围区域 (扩展100像素) x_min = min([p.x for p in qr_position]) - 100 y_min = min([p.y for p in qr_position]) - 100 x_max = max([p.x for p in qr_position]) + 100 y_max = max([p.y for p in qr_position]) + 100 # 确保坐标在图像范围内 x_min = max(0, x_min) y_min = max(0, y_min) x_max = min(frame.shape[1], x_max) y_max = min(frame.shape[0], y_max) # 裁剪二维码周围区域 roi = frame[y_min:y_max, x_min:x_max] # 使用PaddleOCR识别文字 result = self.ocr.ocr(roi, cls=True) text = "\n".join([line[1][0] for res in result for line in res]) self.ocr_signal.emit(f"OCR结果:\n{text}") except Exception as e: self.ocr_signal.emit(f"OCR错误: {str(e)}") def stop_camera(self): self.running = False if self.cap: self.cap.release() def image_recognition(self, file_path): try: img = cv2.imread(file_path) # 传统方法 if self.traditional_method: results = pyzbar.decode(img) if results: return "\n".join([f"传统方法: {obj.data.decode('utf-8')}" for obj in results]) # AI检测方法 if self.ai_detection: # 实际项目中替换为AI模型推理 results = pyzbar.decode(img) if results: return "\n".join([f"AI检测: {obj.data.decode('utf-8')}" for obj in results]) return "未识别到二维码" except Exception as e: return f"识别错误: {str(e)}" class QRCodeApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("二维码识别系统") self.setGeometry(100, 100, 1000, 700) # 创建相机线程对象 self.camera_thread_obj = CameraThread() self.camera_thread = threading.Thread(target=self.camera_thread_obj.start_camera) self.init_ui() # 连接信号 self.camera_thread_obj.image_signal.connect(self.update_image) self.camera_thread_obj.result_signal.connect(self.update_results) self.camera_thread_obj.ocr_signal.connect(self.update_ocr) def init_ui(self): # 创建主部件和布局 main_widget = QWidget() main_layout = QVBoxLayout() # 图像显示区域 self.image_label = QLabel() self.image_label.setAlignment(Qt.AlignCenter) self.image_label.setMinimumSize(640, 480) self.image_label.setStyleSheet("background-color: black; border: 2px solid gray;") # 结果展示区域 self.result_label = QLabel("识别结果将显示在这里") self.result_label.setStyleSheet("font-size: 14px; padding: 10px; border: 1px solid #ddd; min-height: 60px;") self.result_label.setWordWrap(True) self.ocr_label = QLabel("OCR结果将显示在这里") self.ocr_label.setStyleSheet("font-size: 14px; padding: 10px; border: 1px solid #ddd; min-height: 80px;") self.ocr_label.setWordWrap(True) # 创建控制面板 control_layout = QHBoxLayout() # 复选框 self.traditional_check = QCheckBox("传统方法") self.traditional_check.setChecked(True) self.ai_check = QCheckBox("AI检测") self.ocr_check = QCheckBox("OCR识别") # 按钮 self.image_btn = QPushButton("图片识别") self.image_btn.clicked.connect(self.select_image) self.image_btn.setStyleSheet("padding: 8px; background-color: #4CAF50; color: white;") self.camera_on_btn = QPushButton("开启相机") self.camera_on_btn.clicked.connect(self.start_camera) self.camera_on_btn.setStyleSheet("padding: 8px; background-color: #2196F3; color: white;") self.camera_off_btn = QPushButton("关闭相机") self.camera_off_btn.clicked.connect(self.stop_camera) self.camera_off_btn.setStyleSheet("padding: 8px; background-color: #f44336; color: white;") self.camera_off_btn.setEnabled(False) # 添加控件到控制面板 control_layout.addWidget(self.traditional_check) control_layout.addWidget(self.ai_check) control_layout.addWidget(self.ocr_check) control_layout.addStretch() control_layout.addWidget(self.image_btn) control_layout.addWidget(self.camera_on_btn) control_layout.addWidget(self.camera_off_btn) # 添加到主布局 main_layout.addWidget(self.image_label, 70) main_layout.addLayout(control_layout, 10) main_layout.addWidget(QLabel("识别结果:"), 5) main_layout.addWidget(self.result_label, 10) main_layout.addWidget(QLabel("OCR结果:"), 5) main_layout.addWidget(self.ocr_label, 10) main_widget.setLayout(main_layout) self.setCentralWidget(main_widget) def update_image(self, image): pixmap = QPixmap.fromImage(image) self.image_label.setPixmap(pixmap.scaled( self.image_label.width(), self.image_label.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation )) def update_results(self, text): self.result_label.setText(text) def update_ocr(self, text): self.ocr_label.setText(text) def start_camera(self): # 检查至少选择一种识别方法 if not (self.traditional_check.isChecked() or self.ai_check.isChecked()): self.result_label.setText("错误:请至少选择一种识别方法") return # 设置线程参数 self.camera_thread_obj.traditional_method = self.traditional_check.isChecked() self.camera_thread_obj.ai_detection = self.ai_check.isChecked() self.camera_thread_obj.ocr_enabled = self.ocr_check.isChecked() # 启动相机线程 self.camera_thread = threading.Thread(target=self.camera_thread_obj.start_camera) self.camera_thread.daemon = True self.camera_thread.start() # 更新按钮状态 self.camera_on_btn.setEnabled(False) self.camera_off_btn.setEnabled(True) self.result_label.setText("相机已启动...") def stop_camera(self): self.camera_thread_obj.stop_camera() self.camera_on_btn.setEnabled(True) self.camera_off_btn.setEnabled(False) self.image_label.clear() self.result_label.setText("相机已关闭") def select_image(self): # 检查至少选择一种识别方法 if not (self.traditional_check.isChecked() or self.ai_check.isChecked()): self.result_label.setText("错误:请至少选择一种识别方法") return file_path, _ = QFileDialog.getOpenFileName( self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)" ) if file_path: # 设置识别方法 self.camera_thread_obj.traditional_method = self.traditional_check.isChecked() self.camera_thread_obj.ai_detection = self.ai_check.isChecked() # 执行图片识别 result = self.camera_thread_obj.image_recognition(file_path) self.result_label.setText(result) # 显示图片 pixmap = QPixmap(file_path) self.image_label.setPixmap(pixmap.scaled( self.image_label.width(), self.image_label.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation )) # 如果启用了OCR,执行OCR识别 if self.ocr_check.isChecked(): img = cv2.imread(file_path) results = pyzbar.decode(img) if results: self.camera_thread_obj.run_ocr(img, results[0].polygon) if __name__ == "__main__": app = QApplication(sys.argv) window = QRCodeApp() window.show() sys.exit(app.exec_()) 将代码里的涉及到界面的转化为.ui文件
最新发布
09-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值