注:默认认为反射代码与Worker类不在同一个包下,下面的“使用条件”才是正确的。
下面以Worker类来讲解Java反射的三种用途(创建实例,调用方法,访问属性):
Worker类如下:
class Worker{ /*两个public构造方法*/ public Worker(){ count++; } public Worker(String name){ super(); this.name = name; } /*两个private构造方法*/ private Worker(String name,int age){ super(); this.name = name; this.age = age; } private Worker(int age){ super(); this.age = age; } /*两个private属性*/ private String name; private int age; /*一个public属性*/ public String parents; /*一个private static属性*/ private static int count; /*一个 public static属性*/ public static String address; /*两个public方法*/ public String getName(){ return name; } public void setName(String name){ this.name = name; } /*两个private方法*/ private int getAge(){ return age; } private void setAge(int age){ this.age = age; } /*两个public static方法*/ public static void printAddress(String address){ System.out.println("printAddress==="+address); } public static void printAddress(){ System.out.println("printAddress===default"); } /*两个private static方法*/ private static void printlnCount(int count){ System.out.println("printCount==="+count); } private static void printlnCount(){ System.out.println("printCount===000"); } @Override public String toString(){ return "这是一个Worker实例:name="+name+",age="+age; } }
在使用反射时,第一步要获取,被反射类的Class对象。获取Class对象有3中方法,如下:
package test; public class ReflectTest { public static void main(String[] args) throws Exception{ //方法1,使用"包名.类名.class"形式获取Class对象 Class c1 = Worker.class; System.out.println("c1==="+c1); //方法2,使用"对象名.getClass()"形式获取Class对象 Worker w = new Worker(); Class c2 = w.getClass(); System.out.println("c2==="+c2); //方法3,使用"Class.forName("包名.类名")"形式获取Class对象 Class c3 = Class.forName("test.Worker"); System.out.println("c3==="+c3); } }
第一,创建实例
package test; import java.lang.reflect.Constructor; public class ReflectTest { public static void main(String[] args) throws Exception{ //提前获取Class对象 Class c = Class.forName("test.Worker"); //创建实例 //方法1,使用"Class对象名.newInstance()"创建实例 //使用条件:该方法要求Worker类必须有public类型且无参的构造方法 Worker w1 = (Worker)c.newInstance(); System.out.println("w1==="+w1); //方法2,使用getConstructor创建实例 //方法2.1,公有、无参构造方法 //使用条件:该方法要求Worker类有一个public类型且无参的构造方法 Constructor con21 = c.getConstructor();//只能获取public类型的无参构造方法 Worker w21 = (Worker)con21.newInstance(); System.out.println("w21==="+w21); //方法2.2,公有、有参构造方法 //使用条件:该方法要求Worker的构造方法是公有的 Constructor con22 = c.getConstructor(String.class);//根据构造方法的参数类型和顺序,传入对应的Class对象 Worker w22 = (Worker)con22.newInstance("李彦宏");//根据构造方法的参数类型和顺序,传入对应的参数 System.out.println("w22==="+w22); //方法3,使用getDeclaredConstructor创建实例 //方法3.1,无参构造方法 Constructor con31 = c.getDeclaredConstructor();//无论是private还是public类型的无参构造方法,都可以获取 con31.setAccessible(true);//关键,如果无参构造方法是private类型的,这句必须加 Worker w31 = (Worker)con31.newInstance(); System.out.println("w31==="+w31); //方法3.2,有参构造方法 Constructor con32 = c.getDeclaredConstructor(String.class,int.class);//根据构造方法的参数类型和顺序,传入对应的Class对象 con32.setAccessible(true);//关键,如果无参构造方法是private类型的,这句必须加 Worker w32 = (Worker)con32.newInstance("周星驰",40);//根据构造方法的参数类型和顺序,传入对应参数 System.out.println("w32==="+w32); } }
第二,调用方法
package test;
import java.lang.reflect.Method; public class ReflectTest { public static void main(String[] args) throws Exception{ //提前获取Class对象 Class c = Class.forName("test.Worker"); //调用方法 //方法1,调用静态方法 //使用条件:使用之前需要先获取该类的Class对象 //方法1.1,调用公有、无参构造方法 //使用条件:该方法必须是public static和无参的 Method m11 = c.getMethod("printAddress"); m11.invoke(c); //方法1.2,调用公有、有参构造方法 //使用条件:该方法必须是public static和有参的 Method m12 = c.getMethod("printAddress",String.class);//根据参数名、参数类型和顺序,填入正确的参数名、参数的Class对象 m12.invoke(c, "北京");//传入该类的Class对象,和方法对应的参数 //方法1.3,调用私有、有参构造方法 //使用条件:该方法无论是public还是private类型都可以使用 Method m13 = c.getDeclaredMethod("printlnCount", int.class); m13.setAccessible(true);//关键,如果该方法是private类型的,则这句必须加 m13.invoke(c, 100); //方法2,调用成员方法 //使用条件:使用之前必须先创建实例 Worker w = (Worker)c.newInstance(); //方法2.1,调用公有、无参成员方法 //使用条件:该方法必须是public类型且无参的方法 Method m21 = c.getMethod("getName"); System.out.println("getName==="+m21.invoke(w)); //方法2.2,调用公有、有参成员方法 //使用条件:该方法必须是public类型且有参的方法 Method m22 = c.getMethod("setName", String.class); m22.invoke(w, "李开复"); //方法2.3,调用私有、有参成员方法 //使用条件:该方法可以是public,也可以是private类型 Method m23 = c.getDeclaredMethod("setAge", int.class); m23.setAccessible(true);//关键,如果该方法是private类型方法,则必须加上 m23.invoke(w,20); //另:遍历所有public方法(包括静态方法和成员方法,--也包括--父类的方法) Method [] ms1 = c.getMethods(); for(Method m:ms1){ System.out.println(m.getName()); } //遍历所有方法(包括静态方法和成员方法,--不包括--父类的方法) Method [] ms2 = c.getDeclaredMethods(); for(Method m:ms2){ System.out.println(m.getName()); } } }
第三访问属性
package test; import java.lang.reflect.Field; public class ReflectTest { public static void main(String[] args) throws Exception{ //提前获取Class对象 Class c = Class.forName("test.Worker"); //访问属性 //方法1,访问静态属性 //使用条件:使用之前需要先获取该类的Class对象 //方法1.1,访问public static属性 //使用条件:该属性必须是public static Field f11 = c.getField("address"); f11.set(c, "天津"); System.out.println("address==="+f11.get(c)); //方法1.2,访问private static属性 //使用条件:该属性必须是static类型,可以是public类型,也可以是private类型 Field f12 = c.getDeclaredField("count"); f12.setAccessible(true);//关键,如果该属性是private类型,则该句必须加上 f12.set(c, 100); System.out.println("count==="+f12.get(c)); //2.访问成员属性 //使用条件:使用之前需要先获取该类的实例 Worker w = new Worker("凤姐"); System.out.println("w.getName()==="+w.getName()); //方法2.1,访问public成员属性 //使用方法:该属性必须是public成员属性 Field f21 = c.getField("parents"); f21.set(w, "如花"); System.out.println("w.parents==="+w.parents); //方法2.2,访问private成员属性 //使用方法:该属性可以是public类型,也可以是private类型 Field f22 = c.getDeclaredField("name"); f22.setAccessible(true);//关键,如果是private类型属性,则该句必须加上 f22.set(w, "芙蓉姐姐"); System.out.println("w.getName()==="+w.getName()); //另:遍历所有的public属性 Field [] fs1 = c.getFields(); for(Field f:fs1){ System.out.println("f==="+f.getName()); } //遍历所有的属性 Field [] fs2 = c.getDeclaredFields(); for(Field f:fs2){ System.out.println("f==="+f.getName()); } } }
相关推荐
在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...
以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class对象**:首先,我们需要获取到目标类的Class对象,这可以通过`Class.forName()`方法或者对象的`getClass()`方法来实现。例如,...
本示例将深入探讨如何使用Java反射进行各种方法的调用。 首先,让我们从调用无参数的方法开始。在Java中,我们可以通过`Class`对象的`getMethod`方法获取到指定的公共方法,然后通过`invoke`方法调用它。例如: ``...
在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...
以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全限定类名获取Class对象。 - `object.getClass()`: 对象的`getClass()`方法返回该对象的Class...
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...
反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...
本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
通过上述示例,我们了解了如何使用Java反射机制来获取父类的所有属性和方法。这种方法非常灵活,适用于许多不同的场景,如框架开发、测试工具等。需要注意的是,虽然反射功能强大,但在生产环境中应谨慎使用,因为它...
Java反射机制是在程序运行过程中,能够获取到关于类、接口、对象等的详细信息,并能动态地创建对象、调用方法、访问字段。这种能力使得开发者能够在不知道具体类名的情况下,仍然可以操作这些类的成员。 2. **反射...
下面我们将详细探讨Java反射的基本方法及其应用。 一、获取类信息 1. `Class` 类:反射的核心是`Class`类,它代表一个Java类。通过`Class`对象,我们可以获取到类的元数据。获取`Class`对象的方法有: - 使用`...
虽然Java反射机制提供了很多强大的功能,但它也有一些局限性和需要注意的地方: - **性能开销**:使用反射通常会带来一定的性能开销,因为它涉及到额外的查找和类型解析步骤。 - **安全性和稳定性**:反射可以访问...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
总结,Java反射机制为我们提供了强大的动态性,能够方便地获取和操作类的属性和方法,包括私有成员和子类父类中的成员。通过熟练掌握反射技术,开发者可以实现更灵活、更动态的代码,但也需要谨慎使用,以避免潜在的...
下面通过一个简单的示例展示如何使用Java反射机制: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionDemo { public ...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...