JAVA的反射机制简析 ゝ一世哀愁。 2022-06-17 13:23 234阅读 0赞 正常访问java类的方式是先导入要访问的类所在的包,然后实例化对象,最后调用包里面的方法。但是有时候也会存在这样的情况,你需要的类所在的包并不在你的开发套件(SDK)中,而且你也不能把相关的包导入到你的开发工程当中来,但是你又必须要使用这个包中的相关类。有没有一种方式可以在不需要包的情况下也能访问包中的类呢,在这种情况下就可以使用反射机制。关于反射机制的具体原理可以参考相关的书籍和文章,本文主要举几个小例子来说明一下反射机制的使用方法。 **一、使用的一般步骤** a、获得指定的类 b、获得类中需要调用的方法 c、实例化对象 (如果是调用静态方法,不要实例化对象) d、设置对象的属性 (这一步可以根据情况来决定是否需要设置对象的属性) e、调用获得的方法 基本开发环境: 操作系统:Ubuntu12.04 JDK版本:java version "1.7.0\_101" **二、反射机制的几种使用情景** **1、访问类中静态方法** 在指定类中实现两个静态方法,然后通过反射机制来获取这两个静态方法并调用它们。在这里定义两个类,一个类为cn/edu/syau/Demo.java,这个类中定义需要访问的方法和属性等;一个类为Reflect.java,在这个类中实现反射机制来访问Demo类中方法和属性。 Demo.java内容如下: package cn.edu.syau; /* Define a Demo class */ public class Demo { /* Define a static method */ public static void printString(String str) { System.out.println(str); } public static void printHello() { System.out.println("Hello,world!"); } } Reflect.java的内容如下: import java.lang.reflect.Method; public class Reflect { public static void main(String args[]) throws Exception{ /* 1 get class */ Class<?> cls = Class.forName("cn.edu.syau.Demo"); /* 2 get method */ Method printStr = cls.getMethod("printString", String.class); Method printHello = cls.getMethod("printHello"); /* 3 create object */ /* 4 call method */ printStr.invoke(null, "TECH-PRO"); /* call printString method */ printHello.invoke(null); /* call printHello method */ } } 编译上面这个程序的具体命令: javac cn/edu/syau/Demo.java javac Reflect.java java Reflect 通过分析,可以看出调用Demo类中两个静态方法,结果如下: ![Center][] **2、访问类中的普通方法** 在Demo类中实现两个普通方法,Demo类如下所示: package cn.edu.syau; /* Define a Demo class */ public class Demo { /* Define a static method */ public void printString(String str) { System.out.println(str); } public void printHello() { System.out.println("Hello,world!"); } } 在Reflect类中页要进行相应的修改,内容如下: import java.lang.reflect.Method; public class Reflect { public static void main(String args[]) throws Exception{ /* 1 get class */ Class<?> cls = Class.forName("cn.edu.syau.Demo"); /* 2 get method */ Method printStr = cls.getMethod("printString", String.class); Method printHello = cls.getMethod("printHello"); /* 3 create object */ Object obj = cls.newInstance(); /* 4 call method */ printStr.invoke(obj, "TECH-PRO"); /* call printString method */ printHello.invoke(obj); /* call printHello method */ } } 运行结果如下: ![Center 1][] **3、访问类实例化通过带参构造函数** Demo类的具体实现如下: package cn.edu.syau; /* Define a Demo class */ public class Demo { private String name = null; private int age = 0; /* Define a constructor method with parameters */ public Demo(String name, int age) { this.name = name; this.age = age; } /* Define a print informations method */ public void printInfo() { System.out.println("name : " + this.name); System.out.println("age : " + this.age); } } Reflect类的实现如下: import java.lang.reflect.Method; import java.lang.reflect.Constructor; public class Reflect { public static void main(String args[]) throws Exception{ /* 1 get class */ Class<?> cls = Class.forName("cn.edu.syau.Demo"); /* 2 get method */ Method printInfo = cls.getMethod("printInfo"); /* 3 create object */ Constructor<?> con = cls.getConstructor(String.class, int.class); /* get constructor metho */ Object obj = con.newInstance("TECH-PRO", 25); /* create obj */ /* 4 call method */ printInfo.invoke(obj); /* call printInfo method */ } } 运行结果如下: ![Center 2][] **4、设置、访问类中的属性** 访问类中的属性有两种方式,一种是通过setter/getter方法来设置,第二种是直接获得属性并进行设置。 **4.1 通过getter/setter方法** Demo类的定义如下: package cn.edu.syau; /* Define a Demo class */ public class Demo { private String name = null; private int age = 0; /* Define a empty constructor method */ public Demo(){} /* Define a constructor method with parameters */ public Demo(String name, int age) { this.name = name; this.age = age; } /* Define a print informations method */ public void printInfo() { System.out.println("name : " + this.name); System.out.println("age : " + this.age); } /* define setter and getter methods */ public void setAge(int age){this.age = age;} public int getAge(){return this.age;} public void setName(String name){this.name = name;} public String getName(){return this.name;} } Reflect类的实现如下: import java.lang.reflect.Method; import java.lang.reflect.Constructor; public class Reflect { public static void main(String args[]) throws Exception{ /* 1 get class */ Class<?> cls = Class.forName("cn.edu.syau.Demo"); /* 2 get method */ Method printInfo = cls.getMethod("printInfo"); Method setName = cls.getMethod("setName", String.class); Method setAge = cls.getMethod("setAge", int.class); /* 3 create object */ Object obj = cls.newInstance(); /* 4 call method */ setName.invoke(obj, "TECH-PRO"); /* call setName method */ setAge.invoke(obj, 25); /* call setAge method */ printInfo.invoke(obj); /* call printInfo method */ } } 编译运行结果如下: ![Center 3][] **4.2 直接对属性进行设置和访问** Demo类的实现和4.1相同,Reflect类的具体实现如下: import java.lang.reflect.Method; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Reflect { public static void main(String args[]) throws Exception{ /* 1 get class */ Class<?> cls = Class.forName("cn.edu.syau.Demo"); /* 2 get method */ Method printInfo = cls.getMethod("printInfo"); /* 3 create object */ Object obj = cls.newInstance(); /* 4 set member values */ Field name = cls.getDeclaredField("name"); /* get private field */ Field age = cls.getDeclaredField("age"); name.setAccessible(true); /* set field access is public */ age.setAccessible(true); name.set(obj, "TECH-PRO"); /* set name's value */ age.set(obj, 25); /* set age's value */ /* 5 call method */ printInfo.invoke(obj); /* call printInfo method */ } } 编译运行结果如下: ![Center 4][] [Center]: /images/20220617/190696b5b372458ba42ad4e28310c513.png [Center 1]: /images/20220617/2736ab0436e84989b550374117917311.png [Center 2]: /images/20220617/395e0d60ade1472cba94dbb130bf3734.png [Center 3]: /images/20220617/fb3a9de405ea445c9adb947eeb15a9a0.png [Center 4]: /images/20220617/ead9b043170d4e23a90d4bc10b92cab2.png
相关 Java垃圾回收机制简析和案例 Java的垃圾回收机制是一种自动内存管理技术,主要由JVM(Java Virtual Machine)负责执行。以下是垃圾回收机制简析和一些实际案例: 1. **概念简析** 谁践踏了优雅/ 2024年10月19日 05:03/ 0 赞/ 26 阅读
相关 简析:Java中的并发控制机制 在Java中,并发控制机制主要包括以下几大类: 1. 线程管理: - `Thread`:基本的线程类型,继承自`Runnable`接口。 - `Runnable` 向右看齐/ 2024年09月27日 08:27/ 0 赞/ 44 阅读
相关 简析:Java反射机制可能带来的问题 Java反射机制,是Java语言提供的一种动态获取和修改对象信息的机制。它可能会带来以下几种问题: 1. 性能损耗:反射操作通常比直接调用方法或访问字段慢,因为编译器需要重新 墨蓝/ 2024年09月18日 17:21/ 0 赞/ 57 阅读
相关 简析Java的垃圾回收机制 Java的垃圾回收机制是其自动内存管理的一部分,主要目的是帮助开发者避免内存泄漏问题。 1. **引用机制**:Java中的对象通过引用关系相互联系。当一个对象不再被任何引用 我不是女神ヾ/ 2024年09月12日 16:45/ 0 赞/ 42 阅读
相关 Java反射机制深入解析 Java的反射机制是一种强大的工具,它允许程序在运行时检查和修改类、对象及方法的信息。下面对Java反射机制进行深入解析: 1. **Class**:这是反射的主要对象类型, 忘是亡心i/ 2024年09月11日 19:57/ 0 赞/ 103 阅读
相关 java反射机制解析 1.什么是反射 \ JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; \ 对于任意一个对象,都能够调用它的任意一个方法和属性; \ 港控/mmm°/ 2023年07月25日 11:15/ 0 赞/ 4 阅读
相关 JAVA的反射机制简析 正常访问java类的方式是先导入要访问的类所在的包,然后实例化对象,最后调用包里面的方法。但是有时候也会存在这样的情况,你需要的类所在的包并不在你的开发套件(SDK)中,而且你 ゝ一世哀愁。/ 2022年06月17日 13:23/ 0 赞/ 235 阅读
相关 Java反射机制解析 首先在反射之前我们要先了解java类的整个加载机制:我们的.java源码文件通过编译之后会生成一个JVM可识别的二进制字节码.class文件,每一个类都会产生一个Class对象 - 日理万妓/ 2022年04月23日 12:36/ 0 赞/ 299 阅读
相关 java反射机制详细解析 (一)什么是反射机制? 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动 喜欢ヅ旅行/ 2021年09月15日 02:32/ 0 赞/ 385 阅读
还没有评论,来说两句吧...