java反射的工作机制

合集下载

反射机制的方法

反射机制的方法

反射机制的方法反射机制是一种在编程中常用的技术,它允许程序在运行时动态地获取类的信息并操作对象。

通过反射机制,我们可以在不知道具体类的情况下调用其方法、访问其字段以及创建对象实例。

本文将介绍反射机制的原理、应用场景以及注意事项。

一、反射机制的原理反射机制是基于Java的反射API实现的,主要涉及到以下几个核心类:Class、Constructor、Field和Method。

通过这些类,我们可以获取类的信息并进行相应的操作。

1. Class类:表示类的实体,在程序运行时,JVM会为每个类加载对应的Class对象。

通过Class对象,我们可以获取类的构造方法、字段和方法等信息。

2. Constructor类:表示类的构造方法。

通过Constructor类,我们可以创建对象实例。

3. Field类:表示类的字段。

通过Field类,我们可以获取和设置字段的值。

4. Method类:表示类的方法。

通过Method类,我们可以调用类的方法。

反射机制的原理就是通过这些类来获取和操作类的信息,从而实现动态地调用方法、访问字段和创建对象实例。

二、反射机制的应用场景反射机制在实际开发中有着广泛的应用场景,下面列举几个常见的应用场景。

1. 框架设计:许多框架都使用了反射机制来实现插件化的功能。

通过反射,框架可以动态地加载插件并调用其方法。

2. 单元测试:在单元测试中,我们常常需要对私有方法进行测试。

通过反射,我们可以获取私有方法并调用它们,从而实现对私有方法的测试。

3. 动态代理:动态代理是Java中的一种常见设计模式,它可以在运行时动态地生成代理类。

通过反射,我们可以获取类的方法并在代理方法中进行调用。

4. 序列化与反序列化:在将对象存储到文件或者通过网络传输时,我们需要将对象转换为字节流或者字符流。

通过反射,我们可以获取类的字段并将其转换为字节流或者字符流。

三、反射机制的注意事项虽然反射机制在某些情况下非常有用,但是在使用时也需要注意一些问题。

Java泛型和反射机制

Java泛型和反射机制
GenericsFoo douFoo=new GenericsFoo(new Double("33"));
实际上,当构造对象时不指定类型信息的时候,默认会使用 实际上,当构造对象时不指定类型信息的时候,默认会使用Object类 类 这也是要强制转换的原因。 型,这也是要强制转换的原因。
Java泛型:有界类型 泛型: 泛型
GenericsFoo<Double> douFoo=new GenericsFoo<Double>(new Double("33"));
当然, 当然,也可以在构造对象的时候不使用尖括号指定泛型类型的真实类 但是你在使用该对象的时候,就需要强制转换了。比如: 型,但是你在使用该对象的时候,就需要强制转换了。比如:
Java泛型:泛型类语法 泛型: 泛型
泛型类的语法说明: 泛型类的语法说明: 使用<T>来声明一个类型持有者名称,就可以把 当作一个类型代表 来声明一个类型持有者名称 使用 来声明一个类型持有者名称,就可以把T当作一个类型代表 来声明成员、参数和返回值类型。 仅仅是个名字 这个名字可以自定义。 仅仅是个名字, 来声明成员、参数和返回值类a泛型:泛型方法 泛型: 泛型
是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法, 是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法, 只需将泛型参数列表置于返回值前。 只需将泛型参数列表置于返回值前。如: public class ExampleA { public <T> void f(T x) { System.out.println(x.getClass().getName()); } } 使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。 使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛 型方法除了定义不同,调用就像普通方法一样。 型方法除了定义不同,调用就像普通方法一样。

java反射机制的原理

java反射机制的原理

Java反射机制的原理在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。

对于任意一个对象,可以调用它的任意一个方法。

这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

Java 反射机制主要提供了以下功能在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法关于JA V A更多反射机制的资料以及跟高手学习机会,可以加到群422,然后就是912,加上最后的489,感觉还不错。

现在才开始学反射机制没多久,差不多已经把这一块搞清楚了反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor -类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。

其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。

应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法:1、得到构造器的方法Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,Constructor[] getConstructors() -- 获得类的所有公共构造函数Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)2、获得字段信息的方法Field getField(String name) -- 获得命名的公共字段Field[] getFields() -- 获得类的所有公共字段Field getDeclaredField(String name) -- 获得类声明的命名的字段Field[] getDeclaredFields() -- 获得类声明的所有字段3、获得方法信息的方法Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法Method[] getMethods() -- 获得类的所有公共方法Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法Method[] getDeclaredMethods() -- 获得类声明的所有方法在程序开发中使用反射并结合属性文件,可以达到程序代码与配置文件相分离的目的如果我们想要得到对象的信息,一般需要“引入需要的‘包.类’的名称——通过new实例化——取得实例化对象”这样的过程。

java反射机制的应用场景

java反射机制的应用场景

java反射机制的应用场景一、什么是Java反射机制Java反射机制是指在运行时动态获取类的信息并操作类的属性、方法和构造函数等,包括获取类的名称、父类、接口、字段、方法等信息,并可以通过反射实例化对象、调用方法和修改属性等操作。

二、Java反射机制的优点1. 动态性:可以在运行时动态获取类的信息并操作类的属性和方法等。

2. 灵活性:可以根据需要加载不同版本或不同位置的类文件。

3. 扩展性:可以通过反射扩展程序功能,使程序更加灵活和可扩展。

三、Java反射机制的应用场景1. 框架开发:Java反射机制被广泛应用于框架开发中,如Spring框架中就大量使用了Java反射机制。

2. 动态代理:Java反射机制可以实现动态代理,使得程序更加灵活和可扩展。

3. 单元测试:Java反射机制可以在单元测试中快速生成对象并调用方法进行测试。

4. 序列化与反序列化:Java反射机制可以实现对象序列化与反序列化,将对象转换为二进制流或JSON字符串,并在网络传输或本地存储中使用。

5. 反编译工具:Java反射机制可以被反编译工具用于分析代码结构和实现原理。

6. 动态加载类:Java反射机制可以动态加载类,使得程序更加灵活和可扩展。

7. 注解处理器:Java反射机制可以被注解处理器用于获取注解信息并进行相应的处理。

四、Java反射机制的具体应用案例1. 框架开发:Spring框架中使用了大量的Java反射机制,如通过反射获取Bean对象并进行依赖注入、通过反射调用方法和修改属性等操作。

2. 动态代理:Java反射机制可以实现动态代理,如通过Proxy类和InvocationHandler接口实现动态代理,并在运行时生成代理对象。

3. 单元测试:JUnit框架中使用了Java反射机制,在测试方法执行前会先调用@Before注解标记的方法,并在测试方法执行后调用@After 注解标记的方法。

4. 序列化与反序列化:Java序列化与反序列化可以使用ObjectInputStream和ObjectOutputStream类实现,如将对象转换为二进制流并存储在文件中或传输到网络中。

java反射获取类方法

java反射获取类方法

java反射获取类方法Java反射是指在运行时获取类的信息,并动态地创建、启动和操作对象的机制。

Java 反射可以让程序在运行时获取类的信息,例如:类名、父类、接口、方法等,还可以动态地创建类的实例、访问和修改类的属性、调用类的方法等。

在Java中,每个类都有其静态类型信息(编译时确定)、动态类型信息(运行时确定)。

静态类型信息指的是类的成员变量和方法列表,这些信息在编译时就已确定,因此静态类型信息是无法在运行时动态修改的。

而动态类型信息指的是类的实例,这些实例的类型在运行时才能确定。

因此,Java反射机制就是通过动态类型信息,在运行时获取、操作和修改类的静态类型信息。

Java反射可以通过以下几个步骤来获取类的方法信息:1. 获取Class对象要获取一个类的方法信息,首先需要获取该类的Class对象。

在Java中,每个类都有其对应的Class对象,可以通过以下方式获取:```Class<?> clazz = ClassName.class;```其中,ClassName为想要获取的类的名称。

另外,Java还提供了Class.forName方法来获取Class对象,该方法需要传入完整的类名,例如:2. 获取方法信息- getDeclaredMethods:获取该类中所有声明的方法,不包括父类和接口中的方法,但包括private修饰的方法。

```Method[] methods = clazz.getDeclaredMethods();```其中,parameterTypes表示参数类型的Class对象数组。

- getMethod:获取该类及其父类和接口中指定方法名、参数类型和修饰符的public 函数。

3. 调用方法获取到方法信息后,就可以通过反射机制来调用该方法。

Java反射提供了以下两种方式来调用方法:- invoke:通过反射机制调用指定类的实例方法。

需要传入方法调用的对象及方法的参数。

JAVA的内省机制(introspector)与反射机制(reflection)

JAVA的内省机制(introspector)与反射机制(reflection)

JAVA的内省机制(introspector)与反射机制(reflection)2010-05-05 20:49相对而言,反射比内省更容易理解一点。

用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。

例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。

例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。

通过getName/setName 来访问 name 属性,这就是默认的规则。

Java 中提供了一套API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。

一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:Java代码1.package MyTest;2.public class bean {3.private String id = null ;4.private String name = null ;5.6.public String getId() {7.return id;8. }9.public void setId(String id) {10. this.id = id;11. }12.13. public String getName() {14. return name;15. }16. public void setName(String name) {17. = name;18. }19.}20.21.package MyTest;22.import java.beans.BeanInfo;23.import java.beans.EventSetDescriptor;24.import java.beans.Introspector;25.import java.beans.MethodDescriptor;26.import java.beans.PropertyDescriptor;27.import ng.reflect.Method;28.public class myBeanIntrospector {29.public myBeanIntrospector()30. {31. try32. {33. //实例化一个Bean34. bean beanObj = new bean();35. //依据Bean产生一个相关的BeanInfo类36. BeanInfo bInfoObject =37. Introspector.getBeanInfo(beanObj.getClass(),beanObj.getClass().getSuperclass());38. //定义一个用于显示的字符串39. String output = "";40.41. //开始自省42.43. /*44. * BeanInfo.getMethodDescriptors()45. * 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回46. *47. * MethodDescriptor类48. * 用于记载一个成员方法的所有信息49. * MethodDescriptor.getName()50. * 获得该方法的方法名字51. * MethodDescriptor.getMethod()52. * 获得该方法的方法对象(Method类)53. *54. * Method类55. * 记载一个具体的的方法的所有信息56. * Method.getParameterTypes()57. * 获得该方法所用到的所有参数,以Class数组的形式返回58. *59. * Class..getName()60. * 获得该类型的名字61. */62. output = "内省成员方法:\n";63. MethodDescriptor[] mDescArray =bInfoObject.getMethodDescriptors();64. for (int i=0;i<mDescArray.length ;i++ )65. {66. //获得一个成员方法描述器所代表的方法的名字67. String methodName = mDescArray[i].getName();68.69. String methodParams = new String();70. //获得该方法对象71. Method methodObj = mDescArray[i].getMethod();72. //通过方法对象获得该方法的所有参数,以Class数组的形式返回73. Class[] parameters = methodObj.getParameterTypes();74. if (parameters.length>0)75. {76. //获得参数的类型的名字77. methodParams = parameters[0].getName();78. for (int j=1;j<parameters.length ;j++ )79. {80. methodParams = methodParams + "," +parameters[j].getName();81. }82. }83. output += methodName + "(" + methodParams + ")\n";84. }85. System.out.println(output);86.87. /*88. * BeanInfo.getPropertyDescriptors()89. * 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回90. *91. * PropertyDescriptor类92. * 用于描述一个成员属性93. *94. * PropertyDescriptor.getName()95. * 获得该属性的名字96. *97. * PropertyDescriptor.getPropertyType()98. * 获得该属性的数据类型,以Class的形式给出99. *100. */101. output = "内省成员属性:\n";102. PropertyDescriptor[] mPropertyArray =bInfoObject.getPropertyDescriptors();103.for (int i=0;i<mPropertyArray.length ;i++ ) 104. {105. String propertyName =mPropertyArray[i].getName();106. Class propertyType =mPropertyArray[i].getPropertyType();107. output += propertyName + " ( "+ propertyType.getName() + " )\n";108. }109. System.out.println(output);110.111.112./*113. * BeanInfo.getEventSetDescriptors()114. * 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回115. *116. * EventSetDescriptor类117. * 用于描述一个成员事件118. *119. * EventSetDescriptor.getName()120. * 获得该事件的名字121. *122. * EventSetDescriptor.getListenerType()123. * 获得该事件所依赖的事件监听器,以Class的形式给出124. *125. */126. output = "内省绑定事件:\n";127. EventSetDescriptor[] mEventArray =bInfoObject.getEventSetDescriptors();128.for (int i=0;i<mEventArray.length ;i++ )129. {130. String EventName = mEventArray[i].getName(); 131. Class listenerType =mEventArray[i].getListenerType();132. output += EventName + "(" + listenerType.getName() + ")\n";133. }134. System.out.println(output);135. System.out.println("write by esonghui :"); 136.137. }138.catch (Exception e)139. {140. System.out.println("异常:" + e);141. }142. }143.public static void main(String[] args) 144. {145.new myBeanIntrospector();146. }147.}。

java反射机制的原理

java反射机制的原理Java反射机制是Java语言的一项重要特性,可以在运行时获取Java类的信息,包括属性、方法、构造器等。

这个机制让Java编程变得更加灵活,允许程序在运行时动态地加载和操作Java类,为Java程序的设计和实现提供了更多的选择。

Java反射机制的原理是基于Java虚拟机(JVM)的类加载机制和反射API的实现,主要涉及以下几个方面:1. 类加载在Java程序中,所有的类都需要被加载到JVM中才能被使用。

类加载机制是JVM中重要的一环,它把类文件从磁盘读取到内存中,并进行校验、转换和初始化等步骤,最终生成可执行的 Java 类。

类加载器负责加载 Java 类,其白俄罗斯年轻摇滚乐手Gusli模块会在运行时动态创建新的类或加载已经存在的类。

2. 反射 APIJava反射机制提供了丰富的反射API,包括Class类、Method类、Field类、Constructor类等。

这些类提供了获取Java类信息、访问Java类属性和方法的方法,使得Java程序可以在运行时动态地获取和操作Java类。

反射API是Java反射机制的基础,它使得Java程序实现了动态编程的能力。

Java程序可以在运行时动态地加载Java类,这是Java反射机制的重要特性之一。

通过反射API,Java程序可以从外部文件或网络加载新的Java类,或者从内部动态创建新的Java类。

这种动态加载的机制使得Java程序具有更高的灵活性和适应性,可以根据实际情况动态地加载和卸载Java类,使程序更加健壮和高效。

4. 类型映射和自动装箱Java反射机制通常涉及到Java类属性和方法的访问,这就需要将Java类型和反射API 中的类型相互映射。

Java类型和反射API类型之间的映射通常是通过Java的自动装箱和拆箱机制实现的。

这种类型映射机制使得Java反射机制更加方便和易用,让程序员能够更灵活地进行Java类的操作。

java反射机制的应用场景

Java反射机制的应用场景1. 什么是Java反射机制Java反射机制是指在运行时动态地获取类的信息并操作类和对象的能力。

通过反射,我们可以在运行时动态地创建对象、调用方法、访问字段等,使得程序具备更高的灵活性和扩展性。

Java反射机制提供了一套API,包括Class、Constructor、Method、Field等等。

通过这些API,我们可以获取类的类型信息,创建对象,调用方法,访问字段等。

2. 反射机制的应用场景Java反射机制具有广泛的应用场景,下面将介绍一些常见的应用场景。

2.1. 动态创建对象反射机制可以在运行时动态地创建对象,这在某些情况下非常有用。

例如,当我们需要根据配置文件或用户输入来决定创建哪个对象时,就可以使用反射来实现。

使用反射创建对象的步骤如下: 1. 获取类的Class对象; 2. 调用newInstance()方法创建对象。

class MyClass {public MyClass() {// ...}}Class<?> cls = MyClass.class;MyClass obj = (MyClass) cls.newInstance();2.2. 动态调用方法反射机制还可以在运行时动态地调用对象的方法。

这在需要根据条件来决定调用哪个方法时非常有用。

使用反射调用方法的步骤如下: 1. 获取类的Class对象; 2. 获取方法的Method 对象; 3. 调用invoke()方法调用方法。

class MyClass {public void sayHello() {System.out.println("Hello!");}}Class<?> cls = MyClass.class;MyClass obj = new MyClass();Method method = cls.getMethod("sayHello");method.invoke(obj);2.3. 动态访问字段反射机制还可以在运行时动态地访问对象的字段。

java反射调用impl的方法

一、介绍Java反射的概念和原理Java反射是指在程序运行时,动态地获取类的信息、调用类的方法和修改类的属性。

通过反射,我们可以在程序运行时动态地创建对象、调用方法和访问属性,而不需要在编译时知道类的类型。

这为程序的灵活性和扩展性提供了很大的便利。

二、Java反射的基本用法1. 获取类的信息通过Java反射,我们可以获取类的各种信息,包括类的名称、父类、接口、构造方法、成员方法、成员变量等。

这些信息可以帮助我们了解类的结构和组成,从而做出相应的操作。

2. 创建对象使用反射,我们可以在运行时动态地创建对象,而不需要在编译时知道类的具体类型。

通过获取类的构造方法,我们可以实例化对象并进行操作。

3. 调用方法通过反射,我们可以动态地调用类的方法。

无论方法是公有的还是私有的,我们都可以使用反射来调用它们。

4. 访问属性反射还可以用于动态地访问和修改类的属性。

我们可以获取类的字段,并且对其进行读写操作。

三、实现Java反射调用impl的方法在实际的应用中,我们经常会遇到需要使用反射调用impl的方法的情况。

下面我们将介绍如何实现这一过程。

1. 获取类的Class对象要使用反射调用impl的方法,首先需要获取类的Class对象。

可以使用Class类的forName方法来获取类的Class对象,也可以通过类的实例对象调用getClass方法来获取Class对象。

2. 创建类的实例在获取到Class对象之后,我们可以通过Class对象的newInstance 方法来创建类的实例。

如果需要调用的方法是静态方法,则可以直接通过Class对象调用方法,不需要创建类的实例。

3. 获取方法对象通过Class对象的getMethod方法或getDeclaredMethod方法来获取类的方法对象。

getMethod方法只能获取公有的方法,而getDeclaredMethod方法还可以获取私有的方法。

4. 调用方法获取到方法对象之后,就可以使用invoke方法来调用方法。

反射机制及应用场景

反射机制及应用场景反射指的是一种在运行时动态地获取、检查和操作类、对象、方法和属性的能力。

在许多编程语言中都存在反射机制,如Java、Python、C#等。

反射机制可以使程序在运行时获取类的信息并根据需求动态调用类的方法或访问类的属性,使得程序具备了更强大的灵活性和可扩展性。

下面将介绍反射机制的应用场景。

1.动态加载类和调用方法通过反射,可以在运行时动态加载指定的类,并通过类的实例调用其方法。

这种能力可以用于实现插件机制,允许用户在不修改源代码的情况下扩展系统功能,只需将插件类的信息配置到系统中即可。

2.泛型类型检查反射可以在运行时对泛型类型进行检查,获取泛型类型的具体参数类型,这对于一些框架和工具来说是非常有用的。

例如,在序列化和反序列化过程中,可以通过反射获取泛型类型的参数,从而正确地处理泛型类型的数据。

3.配置文件解析反射可以帮助我们动态地解析配置文件,将配置文件中的参数映射到类的属性中。

通过反射可以动态地创建类的实例,然后根据配置文件中的参数为实例赋值。

这样,可以在不修改源代码的情况下改变程序的行为,提高程序的可配置性。

4.动态代理动态代理是指在运行时创建一个实现一些接口的代理类对象,实际调用的是代理类的方法,而不是被代理类的方法。

通过反射可以在运行时动态地创建代理类对象,并将被代理类的方法委托给代理类来处理。

这种机制可以实现对方法的动态增强,例如日志记录、性能监控等。

5.序列化和反序列化反射被广泛应用于序列化和反序列化的过程中。

在将对象保存到文件或网络中时,需要将对象转换为字节流或字符串形式。

通过反射可以获取对象的类型信息,然后根据类型信息将对象转换为字节流或字符串。

在反序列化时,同样可以通过反射根据类型信息将字节流或字符串转换为对象。

6.单元测试和框架反射可以用于单元测试和框架的开发中。

通过反射可以在运行时动态地获取类的方法和属性,从而进行相关的测试或框架处理。

例如,在单元测试中,可以使用反射来自动化地测试方法的参数和返回值,而无需手动编写大量的测试用例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java的反射确实好,可以查找类的方法。

package sample;import ng.reflect.*;public class reflectmethods{public static void main(String[]args){try{Class c=Class.forName(args[0]);Method m[]=c.getDeclaredMethods();for(int i=0;i<m.length;i++)System.out.println(m[i].toString());}catch(Throwable e){System.err.println(e);}}}比如要想知道某个类型的方法。

可以这样输入。

例如,Float,想知道这个类型的方法,就先知道他在哪个包。

已经知道在ng中。

输入如图所示:这个图先查找了Stack类的方法、又找了Float的方法。

下面的是把整个类都输出。

package sample;import ng.reflect.*;public class reflectiontest{public static void main(String[]args){if(args.length==0){System.out.println("usage:java reflectiontest class_name"); System.exit(-1);}String name=args[0];try{Class c1=Class.forName(name);Class superc1=c1.getSuperclass();System.out.print("class "+name);if(superc1 !=null&&!superc1.equals(Object.class)) System.out.print(" extends "+superc1.getName()); System.out.print("\n{\n");printconstructors(c1);System.out.println();printMethods(c1);System.out.println();printFields(c1);System.out.println("}");}catch(ClassNotFoundException e){System.out.println("Class not found");}}public static void printconstructors(Class c1){ Constructor[]constructors=c1.getDeclaredConstructors(); for(int i=0;i<constructors.length;i++){Constructor c=constructors[i];Class[]paramTypes=c.getParameterTypes();String name=c.getName();System.out.print(Modifier.toString(c.getModifiers())); System.out.print(" "+name+"(");for(int j=0;j<paramTypes.length;j++){if(j>0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}public static void printMethods(Class c1){Method[]methods=c1.getDeclaredMethods();for(int i=0;i<methods.length;i++){Method m=methods[i];Class retType=m.getReturnType();Class[]paramTypes=m.getParameterTypes();String name=m.getName();System.out.print(Modifier.toString(m.getModifiers())); System.out.print(" "+retType.getName()+" "+name+"("); for(int j=0;j<paramTypes.length;j++){if(j>0) System.out.println(",");System.out.print(paramTypes[j].getName());}System.out.println(");");}}public static void printFields(Class c1){Field[]fields=c1.getDeclaredFields();for(int i=0;i<fields.length;i++){Field f=fields[i];Class type=f.getType();String name=f.getName();System.out.print(Modifier.toString(f.getModifiers())); System.out.println(" "+type.getName()+" "+name+";");}}}说实话,以上这些程序我只能猜出大概是什么意思,大家明白怎么用了吧!可以查出已有的类型的用法。

代码可以直接复制粘贴,如果不要package打包,可以直接删除。

当然上面的代码太多了还有些小问题。

下面是我修改的。

完全好了。

事实上接口也能显示出方法与成员变量。

但这样就不符合接口的格式了。

想要显示的话,还是可以将就着用的,我也懒得改了。

如下:import ng.reflect.*;public class test{public static void main(String[]args){if(args.length==0){System.out.println("usage:java reflectiontest class_name"); System.exit(-1);}String name=args[0];try{Class c1=Class.forName(name);Class superc1=c1.getSuperclass();System.out.print("class "+name);if(superc1 !=null&&!superc1.equals(Object.class)) System.out.print(" extends "+superc1.getName()); System.out.print("\n{\n");printconstructors(c1);System.out.println();printMethods(c1);System.out.println();printFields(c1);System.out.println("}");}catch(ClassNotFoundException e){System.out.println("Class not found");}}public static void printconstructors(Class c1){ Constructor[]constructors=c1.getDeclaredConstructors(); for(int i=0;i<constructors.length;i++){Constructor c=constructors[i];Class[]paramTypes=c.getParameterTypes();String name=c.getName();System.out.print(Modifier.toString(c.getModifiers())); System.out.print(" "+name+"(");for(int j=0;j<paramTypes.length;j++){if(j>0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}public static void printMethods(Class c1){Method[]methods=c1.getDeclaredMethods();for(int i=0;i<methods.length;i++){System.out.println(methods[i].toString()+";"); }}public static void printFields(Class c1){ Field[]fields=c1.getDeclaredFields();for(int i=0;i<fields.length;i++){System.out.println(fields[i].toString()+";"); }}}。

相关文档
最新文档