`

Java Reflection API学习

阅读更多

一、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 Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...

    JAVA REFLECTION IN ACTION

    反射在Java中主要通过`java.lang.reflect`包来实现,它提供了一系列API用于获取类、构造器、方法和字段的信息,并能在运行时创建和操作对象。这种能力使得Java程序具有了自我认知的能力,能够动态地加载类、调用方法...

    Java Reflection in Action_PDF+sample source

    《Java Reflection in Action》这本书深入探讨了这一主题,为开发者提供了理解和运用反射的强大工具。这本书包含了PDF版的全文以及示例源代码,帮助读者通过实践来学习。 1. **反射基础**: - 反射API:`java.lang...

    Java Reflection In Action(英文版)

    1. **反射基础**:反射API主要包括`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。它们分别代表类、方法、字段和构造器的运行时表示。 2. **...

    基于Java Reflection的数据库访问通用模型设计与实现.pdf

    Java Reflection机制的实现依赖于JDK中的java.lang.reflect包中的反射API和java.lang.Class类。 知识点2:数据库访问通用模型设计 数据库访问通用模型的设计是基于Java Reflection机制和面向接口的编程思想,设置...

    java/jdk API 文档

    Java JDK API文档是Java开发人员不可或缺的参考资料,它包含了Java平台标准版...总的来说,Java JDK API文档是学习和使用Java编程的关键资源,涵盖了从基本语法到高级特性的全面介绍,对于开发者来说是必备的参考工具。

    基于Java Reflection自动逆向生成类间方法关系图的解析器.pdf

    Java Reflection是Java提供的用于在运行时获取类、接口、方法、字段等信息的机制。在本论文中,作者利用反射机制开发了一个能够自动逆向分析Java源代码或编译后的.class文件的解析器。反射在动态语言编程中有着广泛...

    java_Api

    8. **Java Reflection API**:允许程序在运行时检查类、接口、字段和方法的信息,甚至修改它们的行为。 9. **Java安全管理器(Security Manager)**:提供了一种机制,用于限制代码在特定环境下的执行权限,增强了...

    Java中文api

    10. **反射(Reflection)**:Java的反射API允许在运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象和调用方法,是Java强大的特性之一。 通过Java中文API,开发者可以更好地理解Java类库的使用方式,...

    Manning - java reflection in action(2005)

    本书旨在帮助读者理解和掌握如何利用Java反射API来增强代码的灵活性和动态性。 反射机制允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,我们可以创建对象、调用方法、访问和修改字段值,即使在...

    JavaAPI(官方英文版)

    通过深入学习和理解Java API,开发者可以有效地利用这些工具和机制,提高代码的可读性、可维护性和性能。同时,官方文档中的示例代码也是理解和应用这些API的重要资源。在实际开发中,遇到问题时,查阅Java API文档...

    javaApI文件,中文版

    Java API(应用程序编程接口)是Java编程语言的核心组成部分,它为开发者提供了丰富的类库和接口,使得开发人员能够构建各种复杂的应用程序。这个压缩包文件包含的是Java API的中文版,对于那些在阅读英文版时遇到...

    Manning Java Reflection In Action

    无论是对于初学者还是有经验的开发者来说,本书都是学习和掌握Java反射技术不可或缺的宝贵资源。通过阅读本书,不仅可以提高对Java反射的理解,还能激发新的创意和灵感,将反射技术应用于更多创新的场景之中。

    JavaReflectionTuto:Java Reflection API入门教程

    通过学习这个Java Reflection API入门教程,你将能够熟练地在Java程序中运用反射技术,解决各种动态编程和元编程问题。然而,需要注意的是,反射虽然强大,但也应适度使用,避免过度依赖导致代码复杂性和维护性上升...

    Manning - Java Reflection in Action

    通过阅读《Java Reflection in Action》,开发者不仅可以了解到Java反射技术的基本原理和应用场景,还能学习到如何在实践中高效地运用这一强大工具。无论是对于初学者还是经验丰富的开发人员来说,这本书都是一个...

    High performance Java reflection.zip

    在"High performance Java reflection.zip"这个压缩包中,我们可以期待找到关于优化Java反射性能的相关资料,特别是可能涉及的库"reflectasm-master"。 ReflectASM是一个轻量级、高性能的Java反射库,旨在提高反射...

    JAVA API中文版文档

    Java API中文版文档是Java开发者的重要参考资料,它详尽地阐述了Java平台标准版(Java SE)和Android SDK中的各种类库、接口和方法。这些文档对于理解和使用Java语言进行软件开发至关重要。以下是对其中一些关键知识...

    JAVA API官方文档中文版.zip

    这个“JAVA API官方文档中文版”压缩包包含了完整的Java API的中文翻译,对于Java开发人员和学习者来说,是一份极其重要的参考资料。 文档通常会按照Java的不同版本进行更新,确保覆盖最新的特性和功能。Java API...

    JAVA API文档

    **JAVA API文档详解** JAVA API(Application Programming Interface)...通过深入学习和熟练使用这些API,开发者可以构建高效、可靠的Java应用程序。在实际开发中,不断查阅和理解API文档是提升编程技能的重要途径。

    javajdk API 文档谷歌翻译版

    Java JDK API文档是Java开发人员的重要参考资料,它包含了Java标准库的所有类、接口、方法和构造函数的详细说明。这份“javajdk API 文档谷歌翻译版”为初学者提供了中文版的API文档,旨在帮助他们更轻松地理解和...

Global site tag (gtag.js) - Google Analytics