关于this.getClass().getSuperClass().getName()与super.getClass()

本文详细解析了Java中通过this.getClass().getSuperclass().getName()获取父类名称的方法,并对比了this.getClass().getName()与super.getClass().getName()的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接看代码的打印输出:


/**
 * Created by TK on 2016/9/24.
 */
public class Son extends Father {
    public void getSuperClass(){
        System.out.println(this.getClass().getSuperclass().getName());
    }
    public void getSuperClass2(){
        System.out.println(super.getClass().getName());
    }
}
/**
 * Created by zhuyuqing on 16/8/11.
 */
public class Main {
    public static boolean flag;
    public static final AtomicLong nextSeriaNum = new AtomicLong();

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

        Son son = new Son();
        son.getSuperClass();
        son.getSuperClass2();
}
}
输出结果为:
test.Father
test.Son


或许这个输出可能出乎部分人的意料,但事实确实如此。

原因如下:

Object的getClass()方法的释义是:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

    /**
     * Returns the runtime class of this {@code Object}. The returned
     * {@code Class} object is the object that is locked by {@code
     * static synchronized} methods of the represented class.
     **/

释义指出,要返回此Object运行时类,这外当然不可能指Object自己了,否则所有类调用getClass()方法都返回Object.class了。

所以,this.getClass().getName()与super.getClass.getName()返回的都是当前运行的类名,即例子中的test.Son。

要想返回父类名应使用this.getClass().getSuperClass().getName()

package com.app.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.app.dao.DictionaryDao; import com.app.entity.DictionaryEntity; import com.app.service.DictionaryService; import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 字典表服务实现类 */ @Service("dictionaryService") @Transactional public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService { @Override public Page<DictionaryEntity> queryPage(Map<String, Object> params, QueryWrapper<DictionaryEntity> wrapper) { // 分页参数处理 long pageNum = 1; long pageSize = 10; if (params.get("page") != null) { pageNum = Long.parseLong((String) params.get("page")); } if (params.get("limit") != null) { pageSize = Long.parseLong((String) params.get("limit")); } // 创建分页对象 Page<DictionaryEntity> page = new Page<>(pageNum, pageSize); return baseMapper.selectPage(page, wrapper); } @Override public void dictionaryConvert(Object obj, HttpServletRequest request) { try { if (obj == null) return; // 获取所有以"Types"结尾的字段 List<String> fieldNameList = new ArrayList<>(); Class<?> tempClass = obj.getClass(); while (tempClass != null) { for (Field f : tempClass.getDeclaredFields()) { f.setAccessible(true); if (f.getType().equals(Integer.class) && f.getName().endsWith("Types")) { fieldNameList.add(f.getName()); } } tempClass = tempClass.getSuperclass(); } // 获取ServletContext中的字典数据 ServletContext servletContext = request.getServletContext(); Map<String, Map<Integer, String>> dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap"); // 为每个字段赋值 for (String fieldName : fieldNameList) { Field typesField = null; Field valueField = obj.getClass().getDeclaredField(fieldName.replace("Types", "Value")); valueField.setAccessible(true); // 获取Types字段 if (hasField(obj.getClass(), fieldName)) { typesField = obj.getClass().getDeclaredField(fieldName); } else if (obj.getClass().getSuperclass() != null && hasField(obj.getClass().getSuperclass(), fieldName)) { typesField = obj.getClass().getSuperclass().getDeclaredField(fieldName); } if (typesField == null) continue; typesField.setAccessible(true); Integer typeValue = (Integer) typesField.get(obj); // 转换字段名为下划线格式 String dictKey = toUnderScoreCase(fieldName); // 赋值 if (typeValue != null && dictionaryMap.containsKey(dictKey)) { String dictValue = dictionaryMap.get(dictKey).get(typeValue); valueField.set(obj, dictValue); } else { valueField.set(obj, ""); } } } catch (Exception e) { e.printStackTrace(); } } private String toUnderScoreCase(String camelCase) { StringBuilder sb = new StringBuilder(); for (char c : camelCase.toCharArray()) { if (Character.isUpperCase(c)) { sb.append('_').append(Character.toLowerCase(c)); } else { sb.append(c); } } return sb.toString(); } private boolean hasField(Class<?> clazz, String fieldName) { for (Field f : clazz.getDeclaredFields()) { if (f.getName().equals(fieldName)) { return true; } } return false; } }出现类“DictionaryServiceImpl”必须声明为抽象,或为实现“DictionaryService”中的抽象方法“queryPage(Map<String, Object>, Wrapper<DictionaryEntity>)”和方法未从其超类重写方法
最新发布
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值