`

类方法学习三:getDeclaringClass,getEnclosingClass

    博客分类:
  • J2SE
 
阅读更多

转自: http://blog.csdn.net/csdn1234/article/details/2568145

 

1.Class getDeclaringClass()

返回本类的申明处。一个类可能是在另一个类内部定义的.

[java] view plaincopy
  1. System.out.println("Son.ClassS_Pub.class.getDeclaringClass:" + Son.ClassS_Pub.class.getDeclaringClass());  
  2.   
  3. System.out.println("ArrayList.class.getDeclaringClass:" + ArrayList.class.getDeclaringClass());  
  4.   
  5. System.out.println("Son.class.getDeclaringClass:" + Son.class.getDeclaringClass());  

输出结果:

Son.ClassS_Pub.class.getDeclaringClass:class Son

ArrayList.class.getDeclaringClass:null

Son.class.getDeclaringClass:null

2.Class getEnclosingClass()

返回本类的立即封装类。定义此类的外部类.

[java] view plaincopy
  1. System.out.println("Son.ClassS_Pub.class.getEnclosingClass:" + Son.ClassS_Pub.class.getEnclosingClass());  
  2.   
  3. System.out.println("ArrayList.class.getEnclosingClass:" + ArrayList.class.getEnclosingClass());  
  4.   
  5. System.out.println("Son.class.getEnclosingClass:" + Son.class.getEnclosingClass());  

输出结果:

Son.ClassS_Pub.class.getEnclosingClass:class Son

ArrayList.class.getEnclosingClass:null

Son.class.getEnclosingClass:null

与getDeclaringClass无二. 两者的区别在于内部匿名类

3.区别

[java] view plaincopy
  1. public class Son{  
  2.   
  3.   public MyInterface getInterfaceInstance() {  
  4.   
  5.     return new MyInterface() {  
  6.   
  7.       public void sayHello() {  
  8.   
  9.         System.out.println("ArrayList.class.getEnclosingClass:" + this.getClass().getEnclosingClass());  
  10.   
  11.         System.out.println("ArrayList.class.getDeclaringClass:" + this.getClass().getDeclaringClass());  
  12.   
  13.         System.out.println("Hello, nice to meet you!");  
  14.   
  15.       }  
  16.   
  17.     };  
  18.   
  19.   }  
  20.   
  21.     
  22.   
  23.   public static void main(String args[]) throws Exception{  
  24.   
  25.     Son s = new Son();  
  26.   
  27.     MyInterface inst = s.getInterfaceInstance();  
  28.   
  29.     inst.sayHello();  
  30.   
  31.   }  
  32.   
  33. }  

输出的结果是:

getEnclosingClass:class Son

getDeclaringClass:null

getEnclosingClass对内部匿名类也有效.

分享到:
评论

相关推荐

    Java反射学习.pdf

    Java 反射可以分为三大类:类反射、方法反射和构造器反射。 类反射 Java 反射可以获取类的信息,例如类的名称、类的属性、类的方法等。使用 Class.forName() 方法可以获取类的对象,然后使用 getMethods() 方法...

    java 枚举类总结

    3. **`getDeclaringClass()` 方法**:返回枚举常量所属的类。 ```java Class<? extends Enum<?>> clazz = Direction.East.getDeclaringClass(); // 输出 class Direction ``` #### 四、枚举类型的高级用法 1. *...

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    枚举的本质是 java.lang.Enum 的子类,它提供了一些基本方法,如 values()、name()、ordinal()、getDeclaringClass()、equals() 等。 枚举的特性: 1. 枚举的本质是 java.lang.Enum 的子类。 2. 枚举是一种特殊的...

    class.getMethods()

    - `getDeclaringClass()`:获取声明该方法的类。 在实际开发中,`getMethods()`经常用于以下场景: 1. **代码生成**:根据类的方法信息自动生成相应的代码模板。 2. **动态调用**:通过反射调用方法,特别是在框架...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    第大数据微服务架构+区块链第12单元 练习手册试题及答案.docx

    - `getDeclaringClass()`:错误选项,此方法用于获取声明成员的类,而不是获取类的`Class`对象。 4. `String`类特性: - `String`是`Object`的子类。 - `equals()`方法在`String`中被重写,用于比较字符串内容而...

    java实例

    `Class.getSuperclass()`方法可以获取一个类的父类,而`Method.getDeclaringClass()`可以确定方法或字段是在哪个类中声明的。 8. **SampleName.java**:这可能是一个关于如何获取类、接口、方法或字段的名称的示例...

    第大数据微服务架构+区块链第12单元 练习手册试题及答案.pdf

    - `getDeclaringClass()`是用于获取声明成员的类,而非获取类的`Class`对象。 4. `String`类特性: - `String`是不可变的,不能改变其长度。 - `String`继承自`Object`类,并重写了`equals()`方法。 - `String`...

    基于javassist调用方法.zip_动态编码_快速反射

    例如,我们可以使用`CtClass`和`CtMethod`等类来创建或修改方法,然后使用`toClass()`方法将它们转换为实际的Java类。 以下是一个简单的例子,展示了如何使用`javassist`动态创建一个类并添加一个方法: ```java ...

    java 中enum的使用方法详解

    - `getDeclaringClass()`:返回枚举常量所属的枚举类的`Class`对象。 - `name()`:返回枚举常量的名称,即在枚举声明中使用的字符串。 - `ordinal()`:返回枚举常量的序数,即它在枚举声明中的位置,第一个常量的...

    javaenum(枚举)使用详解+总结.pdf

    - `getDeclaringClass()`:返回枚举常量所属的枚举类。 - `name()`:返回枚举常量的名称。 - `ordinal()`:返回枚举常量的序数。 - `toString()`:返回枚举常量的名称。 5. **自定义属性和方法** 你可以在枚举...

    java基础反射IO流线程模式

    Java虚拟机内置了三种主要的类加载器: 1. **Bootstrap ClassLoader**:这是所有类加载器的根加载器,用于加载Java核心库(如`rt.jar`),通常由C++编写,并作为JVM的一部分存在。 2. **Extension ClassLoader**:...

    JAVA2 反射技术 pdf

    5. **Modifier类**:`Modifier`类提供了用于获取字段、方法和构造器修饰符信息的方法。 #### 应用案例 1. **模仿instanceof运算符** 在Java中,`instanceof`是一个关键字,用于判断一个对象是否是某个类的实例。...

    Java枚举类使用场景及实例解析

    5. getDeclaringClass() 方法:返回与此枚举常量的枚举类型相对应的 Class 对象。 使用枚举类可以解决 int 和 String 枚举模式带来的诸多不足,如命名空间、描述性、安全性等问题。枚举类可以保证编译时的类型安全...

    Java学习之反射机制及应用场景介绍

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、对象、方法和字段。在Java中,反射机制是通过`java.lang.Class`、`java.lang.reflect.Constructor`、`java.lang.reflect.Field`和`...

    Java反射学习和反射的应用场景干货都在这里

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性等。在本文中,我们将深入理解Java反射的概念,掌握其核心实现,并探讨它在实际开发中的...

    Java动态代理运用之实现Xutils注入模块

    Java动态代理是Java语言中一个强大的特性,它允许我们在运行时创建代理类,这些代理类可以拦截并增强原对象的方法调用。在本篇中,我们将深入探讨如何使用Java动态代理来实现Xutils的注入模块。Xutils是一个知名的...

    Java枚举类型Enum的用法

    在枚举内部,可以通过`Enum<E extends Enum<E>>`的泛型方法`getDeclaringClass()`获取枚举常量所属的枚举类,以及`name()`和`ordinal()`方法获取常量的名称和在枚举中的位置。 总结来说,Java枚举类型提供了一种...

    java中的枚举类型详细介绍

    - **获取声明的类(getDeclaringClass())**:可以使用`getDeclaringClass()`获取枚举常量所在的类。 - **名称(name())**:`name()`方法返回枚举常量的名称,即定义时的字符串。 4. **从字符串创建枚举**: ...

    Java动态代理1

    我们需要自定义一个类实现`InvocationHandler`接口,并重写`invoke()`方法。在这个方法里,我们可以处理代理逻辑,比如添加额外的行为或改变原有的行为。 ```java public class MyInvocationHandler implements ...

Global site tag (gtag.js) - Google Analytics