Class.getEnclosingClass 和 Class.getDeclaringClass

博客介绍了getDeclaringClass和getEnclosingClass两个方法。getDeclaringClass用于获取对应类的声明类Class对象,getEnclosingClass用于获取对应类的直接外部类Class对象。两者主要区别在于匿名内部类使用上,getEnclosingClass能获取匿名内部类对应外部类Class对象,getDeclaringClass则不能。

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

1、getDeclaringClass
  return the declaring class for this class
  获取对应类的声明类Class对象
2、getEnclosingClass
  return the immediately enclosing class of the underlying class
  (获取对应类的直接外部类Class对象)

区别:
两者的区别在于匿名内部类的使用上、getEnclosingClass能够获取匿名内部类对应的外部类Class对象,而getDeclaringClass不能够获取匿名内部类对应的声明类Class对象。

代码示例:

/**
 * @author <a href="wangte@meitaun.com">Te</a>
 * @date created at 2019/5/6
 */
public class ClassTest {

    /**
     * 1、Class.GetEnclosingClass
     * <doc>获取对应类的直接外部类Class对象</doc>
     * 2、Class.GetDeclaringClass
     * <doc>获取对应类的声明类Class对象</doc>
     * 3、两者的区别
     * <p>
     * GetEnclosingClass与GetDeclaringClass很相近
     * 两者的区别在于匿名内部类、getEnclosingClass对匿名内部类也有效
     */
    public static void main(String[] args) {
        Class<?> enclosingClass = InnerClass.class.getEnclosingClass();
        System.out.println(enclosingClass.getName());

        Class<?> declaringClass = InnerClass.class.getDeclaringClass();
        System.out.println(declaringClass.getName());

        //注意:GetEnclosingClass获取的是直接定义该类的外部类Class实例、这点和getDeclaringClass一致
        Class<?> enclosingClass1 = InnerClass.InnerInnerClass.class.getEnclosingClass();
        System.out.println(enclosingClass1.getName());

        Class<?> declaringClass1 = InnerClass.InnerInnerClass.class.getDeclaringClass();
        System.out.println(declaringClass1.getName());

        //针对匿名内部类的测试
        DifferentBetweenClassGetEnclosingClassAndDeclaringClass s = new DifferentBetweenClassGetEnclosingClassAndDeclaringClass();
        HelloService inst = s.getHelloService();
        inst.sayHello();
    }

    private class InnerClass {

        private class InnerInnerClass {

        }
    }


    public interface HelloService {

        void sayHello();
    }


    public static class DifferentBetweenClassGetEnclosingClassAndDeclaringClass {

        HelloService getHelloService() {
            //匿名内部类
            return new HelloService() {

                @Override
                public void sayHello() {
                    System.out.println(this.getClass().getEnclosingClass());

                    System.out.println(this.getClass().getDeclaringClass());

                }

            };
        }

    }
}

### 回答1: method.getdeclaringclass()是Java反射中的一个方法,用于获取当前方法所在的类的Class对象。具体来说,它返回一个Class对象,该对象表示声明该方法的类或接口。如果该方法是在一个类中声明的,则返回该类的Class对象;如果该方法是在一个接口中声明的,则返回该接口的Class对象。 ### 回答2: method.getdeclaringclass()是一个Java反射API中的一个方法,它用于获取一个方法所在的类的Class对象。换句话说,它可以返回定义该方法的类的Class对象。 在Java中,Class类是用来描述Java类的一个类。它是所有类的父类,包括原始类型数组类型。Class类的实例代表了一个运行时类的类型信息,包括类的名称、继承结构、方法、字段等。可以使用Class.forName(String className)方法获取一个类的Class对象。在获取了一个类的Class对象之后,就可以使用Java反射API来操纵该类的信息了,包括获取类的构造函数、方法、字段等。 method.getdeclaringclass()可以用来获取一个方法所在的类的Class对象。当一个方法被调用时,JVM会在该方法所在的类中查找方法的实现。这个查找过程需要使用到定义方法的类的信息。method.getdeclaringclass()方法返回的就是这个定义方法的类的Class对象。 例如,我们定义了一个类Person,其中有一个getName()方法: public class Person { public String getName() { return "Alice"; } } 如果我们想要获取getName方法所在的类Person的Class对象,可以使用以下代码: Method method = Person.class.getMethod("getName"); Class<?> declaringClass = method.getDeclaringClass(); 在上述代码中,首先使用Person.class获取Person类的Class对象,然后使用getMethod方法得到getName方法的Method对象,最后使用method.getDeclaringClass()获取Person类的Class对象。 总之,method.getdeclaringclass()是Java反射API中一个非常重要的方法,可以用来获取一个方法所在的类的类型信息。它对于Java反射编程动态代码生成非常有用。 ### 回答3: Java中的method.getdeclaringclass()方法用于获取声明该方法的类的Class对象。在Java中,Method类表示一个类中的方法,而Class类是类的模板。因此,method.getdeclaringclass()方法实际上是用于访问方法所属的类的类信息。 使用method.getdeclaringclass()方法,我们可以查看一个方法是在哪个类中声明的,以及该方法所在类的名称、包名其他类信息。这对于了解代码结构调试错误非常有用。例如,如果我们遇到了调用方法时出现的错误,我们可以使用method.getdeclaringclass()方法来确定是哪个类中的方法出现了问题。 此外,method.getdeclaringclass()方法还可以用于比较两个方法是否来自同一个类。因为在Java中,两个不同的类可能有相同的方法名参数列表。使用method.getdeclaringclass()方法,我们可以确定两个方法是否来自同一个类,从而更好地理解比较它们。 综上所述,method.getdeclaringclass()方法是Java中用于获取声明方法的类的Class对象的方法。它可用于查看方法所在类的名称、包名其他类信息,以及用于比较两个方法是否来自同一个类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值