getClass().getName()解析

本文探讨了在Java中如何通过super关键字获取父类名称的方法,并解释了在子类方法中使用super.getClass().getName()总是返回子类名称的原因。同时介绍了如何正确获取父类名称。

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

 

class SuperClass {
 SuperClass() {
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2");

  System.out.println(super.getClass().getName());
 }
 void show() {
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6");
  System.out.println(super.getClass().getName());
 }
}
public class SupClass extends SuperClass {
 public static void main(String args[]) {
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1");
  SuperClass s = new SupClass();
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3");
  s.show();
 }
 void show() {
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4");

  super.show();
  System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5");

  System.out.println(super.getClass().getName());
 }
}

得到的结果为:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2
SupClass
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6
SupClass
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5
SupClass

 

为什么三个结果都是SupClass呢 原因:

在测试类show方法中,直接调用getClass().getName()方法,返回的是子t类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在
show方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()
方法,
等效于调用super.getClass().getName() 方法,
所以,super.getClass().getName()方法返回的也应该是SupClass。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();

 

public class ProxyFactory { private Object target; public ProxyFactory(Object target) { this.target = target; } public Object getProxy(){ /** * newProxyInstance():创建一个代理实例 * 其中有三个参数: * 1、classLoader:加载动态生成的代理类的类加载器 * 2、interfaces:目标对象实现的所有接口的class对象所组成的数组 * 3、invocationHandler:设置代理对象实现目标对象方法的过程,即代理类中如何重写接口中的抽象方法 */ ClassLoader classLoader = target.getClass().getClassLoader(); Class<?>[] interfaces = target.getClass().getInterfaces(); InvocationHandler invocationHandler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * proxy:代理对象 * method:代理对象需要实现的方法,即其中需要重写的方法 * args:method所对应方法的参数 */ Object result = null; try { System.out.println("[动态代理][日志] "+method.getName()+",参数:"+ Arrays.toString(args)); result = method.invoke(target, args); System.out.println("[动态代理][日志] "+method.getName()+",结果:"+ result); } catch (Exception e) { e.printStackTrace(); System.out.println("[动态代理][日志] "+method.getName()+",异常:"+e.getMessage()); } finally { System.out.println("[动态代理][日志] "+method.getName()+",方法执行完毕"); } return result; } }; return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); } } 解释一下
06-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值