`
zxl_ong
  • 浏览: 128552 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

反射实例化内部类

阅读更多
内部类的初始化同一般类的初始化基本相同,只是内部类的类名全称有些区别。下面定义了一个Outer类和一个Inner类:

public class Outer{
   public class Inner{
   }
}

   通过如下方法可以得到Inner类的类名:

public class Outer{
   public class Inner{
   }
   public static void main(String[] args){
      System.out.println(Inner.class);
   }
}


从输出结果可以看到,Inner的类名是xxx.xxx.Outer$Inner这种形式的。这是Java中所谓的synthetic
name。也就是这个名字在源代码中是找不到对应的文件的,是编译器经过修饰之后的名字。

   反射实例化内部类的代码如下:

import java.lang.reflect.*;
public class Outer{
   public class Inner{
   }
   public static void main(String[] args) throws InstantiationException,
   IllegalAccessException,InvocationTargetException{
      System.out.println(Inner.class);
      //查看class是否有构造函数
      System.out.println(Inner.class.getConstructors().length);
      //获取第一个构造函数
      System.out.println(Inner.class.getConstructors()[0]);
      //用构造函数初始化内部类
      System.out.println(Inner.class.getConstructors()[0].newInstance(new Outer()));
   }
}



    从上面代码的打印输出可以看到,公开非静态内部类的默认构造函数需要一个外围类的实例。
    如果是public static的内部类,则默认构造函数是一个无参的构造函数。如果把Inner类的public关键字去掉,运行上面代码会发现抛错了,因为找不到 Inner的构造函数。这个时候只需要将getConstructors方法换成getDeclaredConstructors就可以了。
    如果内部类是私有的,在初始化的时候要将构造函数的访问设置成true。如下:

import java.lang.reflect.*;
public class Outer{
   private class Inner{
   }
   public static void main(String[] args) throws InstantiationException,
    IllegalAccessException,InvocationTargetException{
      System.out.println(Inner.class);
      //查看class是否有构造函数
      System.out.println(Inner.class.getDeclaredConstructors().length);
      //获取第一个构造函数
      Constructor c = Inner.class.getDeclaredConstructors()[0];
      //将c设置成可访问      
      c.setAccessible(true);
      //用构造函数初始化内部类
      System.out.println(c.newInstance(new Outer()));
   }
}


原文出去:http://www.java3z.com/cwbwebhome/article/article8/857.html
分享到:
评论

相关推荐

    反射私有内部类的例子

    本文将详细介绍如何利用反射机制访问和实例化一个私有的内部类,并通过代码示例进行说明。 #### 二、反射概述 反射是Java语言提供的一种能够在运行时分析类和对象的能力。它允许程序获取类、接口、方法和字段的信息...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    JAVA_内部类_反射机制

    总之,Java的内部类提供了灵活的类设计能力,特别是对于继承和多态的需求,而反射机制则为Java代码提供了运行时的强大灵活性,允许程序在运行时动态地操作类和对象。两者结合使用,可以解决许多复杂的编程问题,但也...

    通过反射获取类的实例

    // 处理类无法实例化的情况,如没有无参构造器 } catch (IllegalAccessException e) { // 处理权限问题,如构造器是私有的 } ``` 在这个例子中,`Class.forName()`用于加载类,`newInstance()`则用于创建类的实例...

    flash反射实例

    在AS3.0版本中,引入了反射机制,这是一个强大的工具,允许程序在运行时检查自身并操作其内部结构,如类、属性、方法等。本压缩包文件"flash反射实例"提供了关于AS3.0反射机制的实际应用示例,对于想要深入了解和...

    java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及...

    Java反射实例源码

    标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...

    利用反射生成泛型类对象

    对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。

    学习反射的一个好实例

    - 根据配置文件或用户输入动态加载和实例化服务类。 - 在运行时检查对象的属性和方法,以实现灵活的数据处理逻辑。 - 创建动态代理,对方法调用进行拦截和增强,例如日志记录、性能监控。 - 动态地调用私有方法,...

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的动态性至关重要。 首先,我们需要了解`java.lang.Class`类,它是Java中所有类的通用表示。当我们知道一个类的名字...

    讲解Java中如何构造内部类对象以及访问对象

    这时,`getConstructors()` 将返回空数组,因为非静态内部类需要一个外部类的引用才能实例化。在这种情况下,我们需要使用 `getDeclaredConstructors()` 方法来获取所有声明的构造器,包括私有的: ```java ...

    java反射实例.

    在标题和描述中提到的"java反射实例"是一个简单的入门程序,旨在演示如何使用反射来操作JavaBean的get和set方法。 首先,让我们理解JavaBean。JavaBean是一种符合特定规范的Java类,通常具有公有的getter和setter...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java反射实例

    这将涉及类的加载、对象的实例化以及方法的调用。同时,为了防止安全问题,如访问私有成员,反射操作通常需要`AccessibleObject.setAccessible(true)`来开启访问权限。 在使用反射时,需要注意性能问题,因为反射...

    C#版本的一个封装和反射实例

    在这个"C#版本的封装和反射实例"中,我们将深入探讨两个核心概念:封装和反射。 封装是面向对象编程的基础,它指的是将数据和操作这些数据的方法绑定在一起,形成一个独立的单元,即类。在C#中,我们通过访问修饰符...

    Java反射实例

    以下是对"Java反射实例"的详细解释: 1. **获取Class对象** 要使用反射,首先需要获取到对应的`Class`对象。这可以通过以下三种方式实现: - 使用`Class.forName()`方法,传入类的全名(包括包名)。 - 对象的`...

    C++反射动态创建所需类的实例

    在我们的描述中,通过工厂模式,我们可以根据需要动态地创建不同的类实例,而无需在工厂类内部添加过多的条件分支。 为了减少工厂类中的分支语句,我们可以利用函数指针或函数对象(Functor)。函数指针可以将特定...

    Java中类的反射机制

    Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要通过java.lang.Class类和相关的类库来实现,它使得我们能够在运行时动态...

    java反射机制实例

    其次,反射机制允许我们在运行时创建并实例化对象。使用`newInstance()`方法,我们可以创建指定类的实例,但需要注意的是,该类必须有一个无参构造器,因为`newInstance()`会尝试调用这个构造器: ```java Object ...

    Spring IOC 原理 ,Java 反射实例,自定义注解

    关于Java反射的实例,我们可以创建一个简单的例子。假设我们有一个接口`Service`和两个实现类`ServiceImpl1`、`ServiceImpl2`。在不使用反射的情况下,我们通常会通过new关键字创建服务对象。而通过反射,可以在运行...

Global site tag (gtag.js) - Google Analytics