一、Java Reflection API的测试
package tigers;
import java.lang.reflect.*;
import java.util.*;
import java.sql.*;
import java.io.*;
public class Tiger7 {
private final String name;
private transient int id;
public Tiger7() throws Exception {
this("aa", 23);
}
public Tiger7(String name, int id){
this.name = name;
this.id = id;
}
public static void main(String[] args) {
try {
Class c = Class.forName("tigers.Tiger7");
showFields(c);
showConstructors(c);
showMethods(c);
} catch (Exception ce) {
ce.printStackTrace();
}
}
private static void showConstructors(Class c) {
Constructor[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println("<<<<<<<< " + con + ">>>>>>>>");
}
}
private Tiger7 my_method(String name, int id, Tiger7 t7) throws IOException, SQLException {
return this;
}
private static void showFields(Class c) throws Exception {
Tiger7 t1 = new Tiger7();
Field[] fis = c.getDeclaredFields();
for (Field f : fis) {
System.out.println("........" + f + "........" +
", \ngetModifiers=" + Modifier.toString(f.getModifiers()) +
", \ngetName=" + f.getName());
}
}
private static void showMethods(Class c) throws Exception{
java.lang.reflect.Method[] mes = c.getDeclaredMethods();
for (Method m : mes) {
System.out.println("************** " + m + " **************");
System.out.println("getDeclaringClass=" + m.getDeclaringClass().getName() +
", \ngetExceptionTypes=" + Arrays.toString(m.getExceptionTypes()) +
", \ngetGenericExceptionTypes=" + Arrays.toString(m.getGenericExceptionTypes()) +
", \ngetParameterTypes=" + Arrays.toString(m.getParameterTypes()) +
", \ngetGenericParameterTypes=" + Arrays.toString(m.getGenericParameterTypes()) +
", \ngetReturnType=" + m.getReturnType() +
", \ngetGenericReturnType=" + m.getGenericReturnType() +
", \ngetModifiers=" + Modifier.toString(m.getModifiers()) +
", \ngetName=" + m.getName());
}
}
}
结果:
........private final java.lang.String tigers.Tiger7.name........,
getModifiers=private final,
getName=name
........private transient int tigers.Tiger7.id........,
getModifiers=private transient,
getName=id
<<<<<<<< public tigers.Tiger7(java.lang.String,int)>>>>>>>>
<<<<<<<< public tigers.Tiger7() throws java.lang.Exception>>>>>>>>
************** private static void tigers.Tiger7.showFields(java.lang.Class) throws java.lang.Exception **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.lang.Exception],
getGenericExceptionTypes=[class java.lang.Exception],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showFields
************** private static void tigers.Tiger7.showConstructors(java.lang.Class) **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[],
getGenericExceptionTypes=[],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showConstructors
************** private static void tigers.Tiger7.showMethods(java.lang.Class) throws java.lang.Exception **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.lang.Exception],
getGenericExceptionTypes=[class java.lang.Exception],
getParameterTypes=[class java.lang.Class],
getGenericParameterTypes=[class java.lang.Class],
getReturnType=void,
getGenericReturnType=void,
getModifiers=private static,
getName=showMethods
************** private tigers.Tiger7 tigers.Tiger7.my_method(java.lang.String,int,tigers.Tiger7) throws java.io.IOException,java.sql.SQLException **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[class java.io.IOException, class java.sql.SQLException],
getGenericExceptionTypes=[class java.io.IOException, class java.sql.SQLException],
getParameterTypes=[class java.lang.String, int, class tigers.Tiger7],
getGenericParameterTypes=[class java.lang.String, int, class tigers.Tiger7],
getReturnType=class tigers.Tiger7,
getGenericReturnType=class tigers.Tiger7,
getModifiers=private,
getName=my_method
************** public static void tigers.Tiger7.main(java.lang.String[]) **************
getDeclaringClass=tigers.Tiger7,
getExceptionTypes=[],
getGenericExceptionTypes=[],
getParameterTypes=[class [Ljava.lang.String;],
getGenericParameterTypes=[class [Ljava.lang.String;],
getReturnType=void,
getGenericReturnType=void,
getModifiers=public static,
getName=main
二、利用Java Reflection 动态创建对象数组
package tigers;
import java.lang.reflect.*;
public class Tiger11 {
private String name;
public Tiger11(String name) {
this.name = name;
}
public String toString() {
return "(" + name + ")";
}
public static void main(String[] args) {
try {
Class c = Class.forName("tigers.Tiger11");
Object arrays = Array.newInstance(c, 10);
for (int i = 0; i < 10; i++) {
Array.set(arrays, i, new Tiger11("bitan" + i));
}
Tiger11[] tis = (Tiger11[]) arrays; //强制类型转换
System.out.println(java.util.Arrays.toString(tis));
for (int i = 0; i < 10; i++) {
System.out.println(Array.get(arrays, i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
[(bitan0), (bitan1), (bitan2), (bitan3), (bitan4), (bitan5), (bitan6), (bitan7), (bitan8), (bitan9)]
(bitan0)
(bitan1)
(bitan2)
(bitan3)
(bitan4)
(bitan5)
(bitan6)
(bitan7)
(bitan8)
(bitan9)
三、利用Java Reflection创建新实例
package tigers;
import java.lang.reflect.*;
public class Tiger9 {
private String name;
private int id;
public Tiger9(String name, int id) {
this.name = name;
this.id = id;
}
public String toString() {
return "[" + name + ", " + id + "]";
}
public static void main(String[] args) {
try {
Class c = Class.forName("tigers.Tiger9");
Constructor con = c.getDeclaredConstructor(Class.forName("java.lang.String"), int.class);
Tiger9 t9 = (Tiger9) con.newInstance("bitan", 25);
System.out.println(t9);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
[bitan, 25]
四、利用Java Reflection动态获取和改变对象的状态
package tigers;
import java.lang.reflect.*;
public class Tiger10 {
private int id;
private String name;
public Tiger10 (int id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return "[" + name + ", " + id + "]";
}
public static void main(String[] args) {
try {
Tiger10 t10 = new Tiger10(25, "bitan");
Class c = Class.forName("tigers.Tiger10");
Field f = c.getDeclaredField("id");
Field f2 = c.getDeclaredField("name");
System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");
f.setInt(t10, 35);
f2.set(t10, "helen");
System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
[bitan, 25] (bitan,25)
[helen, 35] (helen,35)
同一个Tiger10对象的字段在运行中被动态改变。
五、利用Java Reflection执行方法
package tigers;
import java.lang.reflect.*;
public class Tiger8 {
private int doSomething(String name, int id) {
System.out.println("[" + name + ", " + id + "]");
return id + 1000;
}
public static void main(String[] args) {
try {
Class c = Class.forName("tigers.Tiger8");
Method me = c.getDeclaredMethod("doSomething", Class.forName("java.lang.String"), int.class);
Integer result = (Integer) me.invoke(new Tiger8(), "bitan", 25);
System.out.println(result.intValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
[bitan, 25]
1025
现在将main()中的getDeclaredMethod()改为getMethod(),结果:
java.lang.NoSuchMethodException: tigers.Tiger8.doSomething(java.lang.String, int)
at java.lang.Class.getMethod(Class.java:1581)
at tigers.Tiger8.main(Tiger8.java:27)
这是因为getMethod()不能查找到私有方法。
分享到:
相关推荐
在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...
反射在Java中主要通过`java.lang.reflect`包来实现,它提供了一系列API用于获取类、构造器、方法和字段的信息,并能在运行时创建和操作对象。这种能力使得Java程序具有了自我认知的能力,能够动态地加载类、调用方法...
《Java Reflection in Action》这本书深入探讨了这一主题,为开发者提供了理解和运用反射的强大工具。这本书包含了PDF版的全文以及示例源代码,帮助读者通过实践来学习。 1. **反射基础**: - 反射API:`java.lang...
1. **反射基础**:反射API主要包括`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。它们分别代表类、方法、字段和构造器的运行时表示。 2. **...
Java Reflection机制的实现依赖于JDK中的java.lang.reflect包中的反射API和java.lang.Class类。 知识点2:数据库访问通用模型设计 数据库访问通用模型的设计是基于Java Reflection机制和面向接口的编程思想,设置...
Java JDK API文档是Java开发人员不可或缺的参考资料,它包含了Java平台标准版...总的来说,Java JDK API文档是学习和使用Java编程的关键资源,涵盖了从基本语法到高级特性的全面介绍,对于开发者来说是必备的参考工具。
Java Reflection是Java提供的用于在运行时获取类、接口、方法、字段等信息的机制。在本论文中,作者利用反射机制开发了一个能够自动逆向分析Java源代码或编译后的.class文件的解析器。反射在动态语言编程中有着广泛...
8. **Java Reflection API**:允许程序在运行时检查类、接口、字段和方法的信息,甚至修改它们的行为。 9. **Java安全管理器(Security Manager)**:提供了一种机制,用于限制代码在特定环境下的执行权限,增强了...
10. **反射(Reflection)**:Java的反射API允许在运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象和调用方法,是Java强大的特性之一。 通过Java中文API,开发者可以更好地理解Java类库的使用方式,...
本书旨在帮助读者理解和掌握如何利用Java反射API来增强代码的灵活性和动态性。 反射机制允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,我们可以创建对象、调用方法、访问和修改字段值,即使在...
通过深入学习和理解Java API,开发者可以有效地利用这些工具和机制,提高代码的可读性、可维护性和性能。同时,官方文档中的示例代码也是理解和应用这些API的重要资源。在实际开发中,遇到问题时,查阅Java API文档...
Java API(应用程序编程接口)是Java编程语言的核心组成部分,它为开发者提供了丰富的类库和接口,使得开发人员能够构建各种复杂的应用程序。这个压缩包文件包含的是Java API的中文版,对于那些在阅读英文版时遇到...
无论是对于初学者还是有经验的开发者来说,本书都是学习和掌握Java反射技术不可或缺的宝贵资源。通过阅读本书,不仅可以提高对Java反射的理解,还能激发新的创意和灵感,将反射技术应用于更多创新的场景之中。
通过学习这个Java Reflection API入门教程,你将能够熟练地在Java程序中运用反射技术,解决各种动态编程和元编程问题。然而,需要注意的是,反射虽然强大,但也应适度使用,避免过度依赖导致代码复杂性和维护性上升...
通过阅读《Java Reflection in Action》,开发者不仅可以了解到Java反射技术的基本原理和应用场景,还能学习到如何在实践中高效地运用这一强大工具。无论是对于初学者还是经验丰富的开发人员来说,这本书都是一个...
在"High performance Java reflection.zip"这个压缩包中,我们可以期待找到关于优化Java反射性能的相关资料,特别是可能涉及的库"reflectasm-master"。 ReflectASM是一个轻量级、高性能的Java反射库,旨在提高反射...
Java API中文版文档是Java开发者的重要参考资料,它详尽地阐述了Java平台标准版(Java SE)和Android SDK中的各种类库、接口和方法。这些文档对于理解和使用Java语言进行软件开发至关重要。以下是对其中一些关键知识...
这个“JAVA API官方文档中文版”压缩包包含了完整的Java API的中文翻译,对于Java开发人员和学习者来说,是一份极其重要的参考资料。 文档通常会按照Java的不同版本进行更新,确保覆盖最新的特性和功能。Java API...
**JAVA API文档详解** JAVA API(Application Programming Interface)...通过深入学习和熟练使用这些API,开发者可以构建高效、可靠的Java应用程序。在实际开发中,不断查阅和理解API文档是提升编程技能的重要途径。
Java JDK API文档是Java开发人员的重要参考资料,它包含了Java标准库的所有类、接口、方法和构造函数的详细说明。这份“javajdk API 文档谷歌翻译版”为初学者提供了中文版的API文档,旨在帮助他们更轻松地理解和...