本文针对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反射机制-Class类-Class对象的获取.pdf
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面...
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。
使用JAVA反射机制动态调用 计算器对象的加法,减法函数。 使用JAVA反射机制修改一个学生对象 的私有数据成员(不允许调用setters) 使用的类有Class, Method, Field
Controls whether or not the event is sent back down to the peer once the source has processed it - false means it's sent to the peer; true means it's not. Semantic events always have a 'true' value ...
很小的工具,操作方便,java反编译软件--查看class文件。
包含翻译后的API文档:classgraph-4.8.83-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:io.github.classgraph:classgraph:4.8.83; 标签:github、classgraph、jar包、java、中英对照文档; 使用方法:...
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
# 含有的 Java class(类)(此处仅列举3个): ``` com.amazonaws.auth.AwsChunkedEncodingInputStream com.amazonaws.auth.policy.actions.S3Actions com.amazonaws.auth.policy.conditions.S3ConditionFactory .....
什么是反射 Class类的介绍 如何用Class类获得类的构造方法、成员属性、成员方法 利用java反射机制动态创建对象 利用java反射机制动态调用成员方法和改变成员变量
java反射机制基础学习。Class、Method、Field
(类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) ...(通过反射写一个通用的设置某个对象的某个属性为指定的值) (通过用户的增删改查和学生的登录注册引出中介) (动态代理的概述和实现)
包含翻译后的API文档:classgraph-4.8.90-javadoc-API文档-中文(简体)版.zip; Maven坐标:io.github.classgraph:classgraph:4.8.90; 标签:github、classgraph、中文文档、jar包、java; 使用方法:解压翻译后的...
里面主要是介绍Java反射的只是,包括介绍Class类的初始化,如何通过反射动态加载类和获取类的信息等。
java-spring-boot-restful-api Magazine API - 宁静的 API 示例。 堆 Java 8 日本特许经营协会 弹簧靴 JUnit - Mockito Gradle 先决条件 JDK 1.8 等级 2.2.1 任何 REST 客户端(如 XHR 海报) 可选:GGTS(或...
C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib\servlet-api.jar;%JAVA_HOME%\lib\mysql-connector-java-5.1.30-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-5.1.30-...
Java基础 反射篇 - Java基础 反射篇 - 反射的思想及作用 - 反射的基本使用 - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - ...
关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制
一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...