本文针对jdk6.0中java.lang.Class类的API进行了简单的实例应用,例子简单易懂,比较适合入门级阅读。
实例简介:
/*
*IncludeInnerClass类中包含了三种访问控制的内部类,并且以这三个内部类的引用对象和一个整型数作为属性,在外部类的方法中分别调用了 内部类的方法
*外部类有两个构造方法,一个默认构造方法,一个带一个整型参数的构造方法
*Class类的API大家可以直接查阅jdk手册
*getMethods()系列方法基本与getConstructors()系列方法类似,仅在后序文章中对getMethods()系列方法的一个特例做深入介绍,将涉及covariant return type 和bridge methods。
*/
package classTest;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class IncludeInnerClass implements Runnable{
class DefaultInnerClass{
int i;
public DefaultInnerClass(){}
DefaultInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am DefaultInnerClass.");
}
}
private class PrivateInnerClass{
int i;
PrivateInnerClass(){}
PrivateInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am PrivateInnerClass.");
}
}
public class PublicInnerClass{
int i;
public PublicInnerClass(){}
PublicInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am PublicInnerClass.");
}
}
DefaultInnerClass deic;
private PrivateInnerClass pric;
public PublicInnerClass puic;
int i;
public IncludeInnerClass(){
deic = new DefaultInnerClass(1);
pric = new PrivateInnerClass(2);
puic = new PublicInnerClass(3);
this.i=10;
}
private IncludeInnerClass(int i){
deic = new DefaultInnerClass(1);
pric = new PrivateInnerClass(2);
puic = new PublicInnerClass(3);
this.i=i;
}
public void method(){
deic.innerMethod();
pric.innerMethod();
puic.innerMethod();
}
public void run(){
method();
}
}
public class GetInnerClassTest {
public static void main(String[] args) throws SecurityException{
//直接生成外部类的对象,并调用外部类的方法
IncludeInnerClass iic = new IncludeInnerClass();
System.out.println("regular use of outer class object.");
iic.method();
System.out.println("+++++++++++++++++++++++++++++++++++");
//如何生成内部类对象:必须通过外部类实例
IncludeInnerClass.DefaultInnerClass iicdic = iic.new DefaultInnerClass(2);
System.out.println("regular use of inner class object.");
System.out.println(iicdic.i);
iicdic.innerMethod();
System.out.println("+++++++++++++++++++++++++++++++++++");
//动态加载外部类并通过getDeclaredClasses()得到其包含的内部类名称
Class<?> clc = iic.getClass();
Class<?>[] classArray = clc.getDeclaredClasses();
System.out.println("print inner class name.");
for(int i=0;i<classArray.length;i++){
System.out.println(classArray[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//动态加载内部类,调用getDeclaringClass()得到其外部类
Class<?> clac = iicdic.getClass();
Class<?> outClass = clac.getDeclaringClass();
System.out.println("print outer class name.");
System.out.println(outClass.getName());//如果没有外部类则返回null,小心空指针异常
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到所在的包
Package pack;
pack = clc.getPackage();
System.out.println("print package name.");
System.out.println(pack.getName());
System.out.println(pack.equals(clac.getPackage()));//内部类和外部类的包名相同
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类继承的接口
Class<?>[] interfaceArray = clc.getInterfaces();
System.out.println("print interface name.");
for(int i=0;i<interfaceArray.length;i++){
System.out.println(interfaceArray[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的属性
Field[] field = clc.getDeclaredFields();
System.out.println("print outer class fields");
for(int i=0;i<field.length;i++){
System.out.println(Modifier.toString(field[i].getModifiers())+" "+field[i].getType().getName()+" "+field[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的指定属性
Field f = null;
try {
f = clc.getDeclaredField("pric");
} catch (NoSuchFieldException e) {
System.out.println("no such Field.");
}
System.out.println("print the field we want.");
System.out.println(Modifier.toString(f.getModifiers())+" "+f.getType().getName()+" "+f.getName());
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的所有构造函数及其修饰符和参数:getDeclaredConstructors()得到所有的构造函数
Constructor<?>[] allConArray = clc.getDeclaredConstructors();
System.out.println("print all constructor of outer class.");
for(int i=0;i<allConArray.length;i++){
System.out.println("-----------------------------------");
System.out.println("print modifier and name");
System.out.println(Modifier.toString(allConArray[i].getModifiers())+" "+allConArray[i].getName());
System.out.println("print parameter type");
Class<?>[] caparam = allConArray[i].getParameterTypes();
for(int j=0;j<caparam.length;j++){
System.out.println(caparam[j].getName());
}
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类所有public的构造函数:getConstructor()
Constructor<?>[] publicCon = clc.getConstructors();
System.out.println("print all public constructor of outer class.");
for(int i=0;i<publicCon.length;i++){
System.out.println(Modifier.toString(publicCon[i].getModifiers())+" "+publicCon[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到指定的外部类构造函数getDeclaredConstructor(Class<?>[]),形参为指定构造函数的参数类型数组
Class<?>[] parameterTypes = new Class[1];
parameterTypes[0] = int.class;
Constructor<?> con = null;
try {
con = clc.getDeclaredConstructor(parameterTypes);
} catch (NoSuchMethodException e) {
System.out.println("NO SUCH CONSTURCTOR!!!");
}
System.out.println("we want the constructor with one parameter.");
System.out.println(Modifier.toString(con.getModifiers())+" "+con.getName());
System.out.println(con.getParameterTypes()[0].getName());
System.out.println("+++++++++++++++++++++++++++++++++++");
//Method类与Constructor基本一致,这里不做介绍。
//Method[] getDeclaredMethods(),不包括继承而来的
//Method getDeclaredMethod(Class<?>[])
//Method[] getMethods()得到所有public方法,包括继承而来的
//得到内部类的属性,这里需要注意内部类会隐含一个外部类的final this引用属性,可以通过打印结果观察到
Field[] innerField = clac.getDeclaredFields();
System.out.println("print inner class fields");
for(int i=0;i<innerField.length;i++){
System.out.println(Modifier.toString(innerField[i].getModifiers())+" "+innerField[i].getType().getName()+" "+innerField[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到内部类的构造方法,仅实例getDeclaredConstructors()
Constructor<?>[] innerCon = clac.getDeclaredConstructors();
System.out.println("print all constructor of inner class.");
for(int i=0;i<innerCon.length;i++){
System.out.println(Modifier.toString(innerCon[i].getModifiers())+" "+innerCon[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//实验用,看看得到的数组类和内部类的名称如何显示
Class<int[]> arrayClass = int[].class;
Class<IncludeInnerClass.DefaultInnerClass> innerClass = IncludeInnerClass.DefaultInnerClass.class;
System.out.println(arrayClass);
System.out.println(innerClass.getName());
}
}
分享到:
相关推荐
Java JDBC(Java Database Connectivity)是Java编程语言与各种数据库交互的一种标准接口,它允许Java程序通过JDBC API连接和操作数据库。在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行...
Java SE编程入门教程涵盖了许多Java基础知识,其中包括对Java反射机制的讲解。反射是Java中一个强大的功能,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够实现一些灵活的功能,如动态加载类、...
- [Baeldung:Java反射入门](https://www.baeldung.com/java-reflection) - [Stack Overflow上的相关讨论](https://stackoverflow.com/questions/tagged/java-reflection) 总之,Java反射机制是理解Java动态特性的...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。 1. 反射的基本...
Java官方API帮助文档是Java开发者不可或缺的参考资料,它详尽地介绍了Java平台标准版(Java SE)的各种类库、接口和方法。这份文档是开发者学习和理解Java编程语言的重要工具,帮助他们有效地利用Java的内置功能和...
- **对象**:Java是一种面向对象的编程语言,一切皆对象,对象是类的实例,包含了数据(属性)和行为(方法)。 - **面向对象、跨平台性**:Java的跨平台特性得益于Java虚拟机(JVM),它允许Java程序在任何安装了...
在Java编程语言中,Object类和Class类是两个非常基础且重要的概念,它们构成了Java类层次结构的基础。让我们深入了解一下这两个关键概念。 首先,我们来谈谈Object类。Object类是所有Java类的顶级父类,无论是...
4. **类与对象**:Java是一种面向对象的语言,类是对象的模板,对象是类的实例。了解如何声明类、创建对象、封装数据成员和方法,以及如何使用构造函数是学习Java的重要部分。 5. **继承与多态**:Java支持单一继承...
Java 2 入门与实例教程是一本专为初学者设计的编程指南,旨在帮助读者快速掌握Java语言的基础知识,并通过实例深入理解编程概念。Java作为一种广泛应用的编程语言,广泛应用于软件开发、移动应用、服务器端编程以及...
- **类(Class):** 类是Java中的一种抽象数据类型,它是对象的模板。 - **对象(Object):** 对象是类的一个实例,每个对象都拥有其独立的状态和行为。 - **方法(Method):** 方法是对一组相关操作的封装,用于完成...
7. **反射机制** - **Class类**:获取类的信息,如类名、方法、字段等。 - **动态代理**:在运行时创建一个实现了指定接口的新类。 8. **Java API和库** - **JDBC**:Java数据库连接,用于与各种数据库交互。 -...
14. **反射机制**:通过Class类获取类的信息,动态创建对象,调用方法和访问字段。 15. **Java API的使用**:讲解Java标准库中的各种类和方法,如日期时间API、数学运算、集合操作等。 《Note of Java(Primer).doc...
14. **Java反射机制**:反射允许程序在运行时检查类的信息,创建和操作类的对象,是Java动态性的一个重要体现。 15. **JDBC数据库操作**:Java Database Connectivity(JDBC)是Java连接数据库的标准API,学习如何...
实例将解释如何使用Class类、Constructor类、Method类和Field类来实现反射。 9. **Java标准库**:Java的API提供了大量的类和接口,如 Swing(图形用户界面)、JDBC(数据库连接)、XML处理等。通过实例,读者可以...
我们将学习如何使用Class类、Constructor类、Method类等进行反射操作。 **章节十一:JAVA标准库** JAVA标准库提供了丰富的API,涵盖了网络编程、数据库连接、XML处理等多个领域。本章将挑选一些常用库进行简要介绍...
在Java中,你需要创建一个名为`public class HelloWorld`的源文件,包含`public static void main(String[] args)`方法,其中输出字符串"Hello, World!"。 四、基本语法 1. 注释:Java有三种注释方式,单行注释(//...
- **Class类**:代表Java类,通过Class对象可以创建类的实例、获取类的属性和方法。 10. **JDBC数据库操作** - **JDBC API**:Java连接数据库的标准接口,包括Connection、Statement、PreparedStatement和...
10. **反射**:Java反射API允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法和改变对象状态。这在编写元编程或插件系统时很有用。 11. **泛型**:泛型提供了一种方式来指定容器类的元素类型,增强了...