`

java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    博客分类:
  • Java
阅读更多

用到的实例Person:

interface China {
	public static final String NATIONL="中国";//国籍
	public static final String NAME="wjl";//姓名
	
	public void getBasicInfo();
	public String setBasicInfo(String userName,String pwd);
}

public class Person implements China{
	private String userName; 
	private String passWord;
	
	//构造方法
	public Person(){}
	public Person(String userName) {
		this.userName = userName;
	}
	public Person(String userName, String passWord) {
		this(userName);//调用一个参数的构造方法
		this.passWord = passWord;
	}
	//父类方法
	public void getBasicInfo() {
		System.out.println("国籍:"+NATIONL+",姓名:"+NAME);
	}
	public String setBasicInfo(String userName, String pwd) {
		return "用户名:"+userName+",密码:"+pwd;
	}
	//userName、passWord的setter/getter方法
}

 1、直接执行方法

public static void main(String[] args) {
	try{
		Class<?> c = Class.forName("com.wjl.reflect.Person");
		//调用指定的方法
		Method me = c.getMethod("getBasicInfo");
		//实例化Person对象并调用方法
		me.invoke(c.newInstance());//无参
		
		//调用有参数的方法
		Method me2 = c.getMethod("setBasicInfo",String.class,String.class);//2个String类型的参数
		String result = (String)me2.invoke(c.newInstance(),"admin","123456");
		System.out.println(result);
	}catch(Exception e){
		e.printStackTrace();
	}
}

2、 操作属性/执行“拼接的方法”

public static void main(String[] args) {
	try{
		//1、实例化class对象
		Class<?> c = Class.forName("com.wjl.reflect.Person");//实例化class
		Object obj = c.newInstance();//实例化对象
		setter(obj,"userName","admin",String.class);
		System.out.println(getter(obj,"userName"));
		
		Field nameField = c.getDeclaredField("userName");//获取userName属性
		Field pwdField = c.getDeclaredField("passWord");//获取passWord属性
		
		//让两个属性对外可见,private私有属性的外界不能访问
		//若是不处理将报错:
//			java.lang.IllegalAccessException: Class com.wjl.reflect.InvokeMethodDemo02 can not access a member of class com.wjl.reflect.Person with modifiers "private"
		nameField.setAccessible(true);
		pwdField.setAccessible(true);
		//赋值
		nameField.set(obj,"sa");
		pwdField.set(obj,"sa");
		
		//取值
		System.out.print("用户名:"+nameField.get(obj)+"\t");
		System.out.print("密码:"+pwdField.get(obj));
	}catch(Exception e){
		e.printStackTrace();
	}
}

//set方法
public static void setter(Object obj,String attr,Object value,Class<?> type){
	try{
		System.out.println("执行的方法:"+("set"+initStr(attr)));
		//getMethod(param1,param2):param1方法名称,param2参数类型
		Method me = obj.getClass().getMethod("set"+initStr(attr), type);
		me.invoke(obj,value);
	}catch(Exception e){
		e.printStackTrace();
	}
}

//get方法
public static String getter(Object obj,String attr){
	String result = "";
	try{
		System.out.println("执行的方法:"+("get"+initStr(attr)));
		Method me = obj.getClass().getMethod("get"+initStr(attr));
		result = (String)me.invoke(obj);
	}catch(Exception e){
		e.printStackTrace();
	}
	return result;
}

//该方法用来将字符串的首字母大写
public static String initStr(String str){
	return str.substring(0,1).toUpperCase()+str.substring(1);
}

3、操作数组中的数据

public static void main(String[] args) {
	int temp[]= {1,2,3,4,5};
	//getComponentType():返回表示数组组件类型的 Class
	Class<?> c = temp.getClass().getComponentType();
	System.out.println("数组类型:"+c.getName());
	System.out.println("数组长度:"+Array.getLength(temp));
	System.out.println("数组第一个内容:"+Array.get(temp,0));
	//set(p1,p2,p3):p1要操作的数组 p2:要修改的内容的下标 p3:修改之后的值
	Array.set(temp,0,10);
	System.out.println("修改数组的第一个内容为:"+Array.get(temp,0));
	
	//修改数组的长度
	int[] newArray = (int[])createNewArray(temp,10);
	print(newArray);
}

//创建新的数组
public static Object createNewArray(Object obj,int length){
	Class<?> array = obj.getClass().getComponentType();//得到数组组件类型的class
	Object newObj = Array.newInstance(array, length);//创建新的数组
	System.arraycopy(obj, 0, newObj, 0, Array.getLength(obj));
	return newObj;
}

//打印数组内容
public static void print(Object array){
	if(!array.getClass().isArray()){return ;}
	System.out.println(array.getClass().getComponentType()+"数组的长度为:"+Array.getLength(array));
	System.out.print("数组内容:");
	for(int i=0;i<Array.getLength(array);i++){
		System.out.print(Array.get(array, i)+"、");
	}
}

 

分享到:
评论

相关推荐

    java 反射中操作数组

    本文将详细解释如何在Java反射中操作数组。 首先,我们创建一个字符串数组`String[] sArr = {}`。要获取这个数组的`Class`对象,我们可以调用`getClass()`方法,即`Class css = sArr.getClass();`。这个`Class`对象...

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的...

    java反射机制学习笔记+反射机制实操案例

    总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    JAVA反射机制学习

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性,可以在运行时发现类的信息并创建及调用对象的方法。在...

    Java反射机制笔记(简单易懂)

    通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量和方法。 获取Class对象 ---------------- 在Java中,Class对象是反射机制的基础。我们可以...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java反射机制PPT

    Java反射机制是Java编程语言中一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象...

    JAVA反射机制详解

    Java反射机制是Java语言提供的一种基础功能,通过反射机制,可以在运行时分析类的属性和方法,并动态调用对象的方法。在Java的java.lang.reflect包中包含了一系列的类来支持反射机制的实现,下面详细介绍一下这些类...

    java反射机制文档及代码

    Java反射机制是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用方法以及...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    数组是 Java 语言中的一种基本数据结构,反射机制可以动态地获取数组的信息和调用数组的方法。 反射与泛型是指在反射机制中如何操作泛型。泛型是 Java 语言中的一种类型参数机制,反射机制可以动态地获取泛型的信息...

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    java反射机制

    Java反射机制是在运行时通过Reflection APIs获取任何已知类的内部信息,包括类的修饰符(如public、static等)、超类、实现的接口、字段和方法的全部信息。它还允许在运行时改变字段内容、调用方法,甚至创建未知类...

    JAVA基础--JAVA中的反射机制详解

    JAVA 反射机制是 Java 语言中的一种动态获取信息和动态调用对象方法的功能。它允许程序在运行时获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。 Java 反射机制主要提供了以下功能: 1. 在运行时...

    java反射机制及Method.invoke解释

    在 Java 反射机制中,我们可以通过 Method 对象的 invoke 方法来执行某对象的方法,这个方法的返回值是 Object 类型的,可以是基本类型、数组、集合等各种类型。 Java 反射机制提供了一种动态获取类信息和执行对象...

    Java反射机制2

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于类名、方法名、构造器、字段以及它们的元数据。这个机制的核心在于Java.lang.Class类和java....

Global site tag (gtag.js) - Google Analytics