`

Java反射的一些使用方法

阅读更多

注:默认认为反射代码与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反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    以下是如何使用Java反射来调用私有方法并获取私有属性值的详细步骤: 1. **获取Class对象**:首先,我们需要获取到目标类的Class对象,这可以通过`Class.forName()`方法或者对象的`getClass()`方法来实现。例如,...

    Java方法反射调用demo

    本示例将深入探讨如何使用Java反射进行各种方法的调用。 首先,让我们从调用无参数的方法开始。在Java中,我们可以通过`Class`对象的`getMethod`方法获取到指定的公共方法,然后通过`invoke`方法调用它。例如: ``...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    java 反射的使用

    以下是对Java反射使用及相关知识点的详细阐述: 1. **获取Class对象** - `Class.forName(String className)`: 通过全限定类名获取Class对象。 - `object.getClass()`: 对象的`getClass()`方法返回该对象的Class...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java 反射创建get set方法及反射方法的调用

    本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射操作父类所有属性和方法

    通过上述示例,我们了解了如何使用Java反射机制来获取父类的所有属性和方法。这种方法非常灵活,适用于许多不同的场景,如框架开发、测试工具等。需要注意的是,虽然反射功能强大,但在生产环境中应谨慎使用,因为它...

    Java反射机制的使用和学习方法

    Java反射机制是在程序运行过程中,能够获取到关于类、接口、对象等的详细信息,并能动态地创建对象、调用方法、访问字段。这种能力使得开发者能够在不知道具体类名的情况下,仍然可以操作这些类的成员。 2. **反射...

    java反射基本方法测试

    下面我们将详细探讨Java反射的基本方法及其应用。 一、获取类信息 1. `Class` 类:反射的核心是`Class`类,它代表一个Java类。通过`Class`对象,我们可以获取到类的元数据。获取`Class`对象的方法有: - 使用`...

    Java反射机制总结

    虽然Java反射机制提供了很多强大的功能,但它也有一些局限性和需要注意的地方: - **性能开销**:使用反射通常会带来一定的性能开销,因为它涉及到额外的查找和类型解析步骤。 - **安全性和稳定性**:反射可以访问...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    java反射获取所有属性,获取所有get方法,包括子类父类

    总结,Java反射机制为我们提供了强大的动态性,能够方便地获取和操作类的属性和方法,包括私有成员和子类父类中的成员。通过熟练掌握反射技术,开发者可以实现更灵活、更动态的代码,但也需要谨慎使用,以避免潜在的...

    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中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    反射实例-JAVA反射机制

    在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...

Global site tag (gtag.js) - Google Analytics