内部类的初始化同一般类的初始化基本相同,只是内部类的类名全称有些区别。下面定义了一个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。也就是这个名字在源代码中是找不到对应的文件的,是编译器经过修饰之后的名字。
反射实例化内部类的代码如下:
public class Outer{
public class Inner{
}
public static void main(String[] args){
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。如下:
public class Outer{
private class Inner{
}
public static void main(String[] args){
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());
}
}
当然,构造类的时候还是要遵循Java的可见性的,比如在其他类里面就没有办法初始化一个类中的私有内部类。
分享到:
相关推荐
本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...
总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
总之,Java的内部类提供了灵活的类设计能力,特别是对于继承和多态的需求,而反射机制则为Java代码提供了运行时的强大灵活性,允许程序在运行时动态地操作类和对象。两者结合使用,可以解决许多复杂的编程问题,但也...
### Java反射机制总结 ...总之,Java反射机制是Java语言的一个重要特性,它提供了在运行时动态获取类信息和操作类结构的能力。合理使用反射可以提高程序的灵活性和扩展性,但在使用时也需要考虑到其潜在的问题和限制。
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用...在分析Java反射源码时,可以更深入地了解其内部实现机制,提升对Java平台的理解。
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
Java反射机制是Java语言的一项重要特性,它使得程序能够在运行时获取和操作类的内部信息。虽然反射提供了强大的功能,但在使用时应谨慎,以免引入不必要的性能损耗或安全风险。对于初学者而言,了解并掌握Java反射...
Java反射工具类ReflectionUtils简化了反射操作,使得开发者能够更加方便地探索和操作类的内部结构。理解并合理使用反射工具类,可以提高开发效率,但也需要留意其潜在的安全性和性能问题。在实际开发中,应根据项目...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过反射,我们可以动态地创建对象、访问和修改字段、调用方法,甚至执行私有方法和访问包内可见的元素。...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。当我们需要在运行时动态地...
Java 反射可以分为三大类:类反射、方法反射和构造器反射。 类反射 Java 反射可以获取类的信息,例如类的名称、类的属性、类的方法等。使用 Class.forName() 方法可以获取类的对象,然后使用 getMethods() 方法...
接着,创建一个实现了这些方法的匿名内部类,并通过反射的`newInstance()`方法创建实例。 6. **委托代理** - 委托代理是一种设计模式,通常用于动态构建代理对象,实现代理模式。在Java中,可以使用`java.lang....
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...
Java反射机制是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用方法以及...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及...