转自:http://blog.csdn.net/YidingHe/article/details/3943524
今天折腾了好一阵子,终于明白怎么通过反射来构造内部类对象了。这里头名堂不少,只能一一道来。
首先在 javalang 包下写一个包含内部类的类:
package javalang;
public class Outer {
public static class Inner1{}
}
注意这个类是 public static,后面我们慢慢把这些修饰符去掉。
要想通过反射来创建 Inner1 对象,首先要获得 Inner1 的 Class 对象。我们在 Outer 中写上 main 方法:
public class Outer {
public static class Inner1{}
public static void main(String[] args) {
System.out.println(Inner1.class);
}
}
输出结果:class javalang.Outer$Inner1
然后我们试一下这个类名对不对:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1"));
}
运行一下,没错。然后就是用它来创建对象。创建对象要靠构造方法。这个类有没有构造方法呢?我们可以这么写:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1").getConstructors().length);
}
运行一下,输出 1。看来有。然后看看这个构造方法是什么样子的:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1").getConstructors()[0]);
}
输出结果:public javalang.Outer$Inner1()。这就是缺省构造方法嘛。所以我们可以这样写:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getConstructors()[0].newInstance();
}
输出结果:javalang.Outer$Inner1@ca0b6。这说明执行成功了。
接下来我们把 Inner 的 public 关键字去掉,然后再运行。结果报错了:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
这说明没有找到构造方法。真的没有吗?我们把 main 方法改回来:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getConstructors().length);
}
输出结果:0。真的没有构造方法吗?其实不是,只是构造方法不是公开的。这时我们必须用 getDeclaredConstructors() 来获得:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getDeclaredConstructors().length);
}
输出结果:1。这就把构造方法找到了。然后我们继续调用这个构造方法:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getDeclaredConstructors()[0].newInstance());
}
输出结果:javalang.Outer$Inner1@ca0b6。现在我们可以用反射来构造非公开内部类的对象了。
接下来,我们再把 static 关键字去掉。这时候报错了:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
这说明什么呢?我们调用的时候没有传参数,而错误内容就是说参数数量不正确。那么这个构造方法有什么参数呢?我们改一下代码看看:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getDeclaredConstructors()[0]);
}
输出结果:javalang.Outer$Inner1(javalang.Outer)
原来构造方法里面需要一个 Outer 类型的参数。这好办:
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javalang.Outer$Inner1")
.getDeclaredConstructors()[0].newInstance(new Outer()));
}
输出结果:javalang.Outer$Inner1@ca0b6
OK,原来如此。看来非静态的内部类没有缺省的构造方法,构造时需要传一个外部类的实例作为参数。
相关推荐
### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...
总之,Java的内部类提供了灵活的类设计能力,特别是对于继承和多态的需求,而反射机制则为Java代码提供了运行时的强大灵活性,允许程序在运行时动态地操作类和对象。两者结合使用,可以解决许多复杂的编程问题,但也...
总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。
### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
3. 必须的反射类: - Field类:提供关于类或接口属性的信息,包括访问权限,可以动态地获取和修改字段的值。 - Constructor类:提供类的构造方法信息,允许在运行时创建对象实例。 - Method类:包含类或接口上的方法...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射是通过java.lang.Class、java.lang.reflect包下的类来实现的,如Class、...
Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要通过java.lang.Class类和相关的类库来实现,它使得我们能够在运行时动态...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。当我们需要在运行时动态地...
总的来说,Java反射机制是面向对象编程的一个重要补充,它扩展了Java程序的动态性,允许程序员在运行时访问和操作类的内部结构,增强了代码的灵活性。理解和熟练掌握反射技术,对于提升Java编程能力,尤其是处理复杂...
这种能力使得程序能够动态地获取和操作加载到Java虚拟机(JVM)中的类的内部信息,从而构建出更为灵活的应用。 ##### 1. 检测类 Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用...在分析Java反射源码时,可以更深入地了解其内部实现机制,提升对Java平台的理解。
Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年1月版)进行深度解析,帮助读者更好地...
在Java编程中,反射(Reflection)是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,反射操作通常比直接的Java代码执行慢,因为它涉及到动态类型检查和方法调用。因此,为了提高性能,...
反射机制为Java程序员提供了一种强大的工具,使得程序能够在运行时动态地获取类的信息,并且能够直接操作程序的内部结构。这种能力使得Java程序更加灵活,能够根据运行时的环境变化而调整自己的行为。 #### Java...
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass...
3. API稳定性:反射操作的对象可能是不稳定的,因为它们依赖于Java的内部实现,可能导致兼容性问题。 五、实例解析 在提供的"Java反射经典实例.htm"文件中,可能会包含具体的代码示例,演示如何使用反射创建对象、...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java 8中,虽然没有引入重大的反射新特性,但原有的反射API仍然提供了丰富的功能,使得开发者...