`

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

    候捷谈Java反射机制

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

    java反射机制文档及代码

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

    Java方法反射调用demo

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

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

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

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

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

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

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

    java反射机制及Method.invoke解释

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

    Java反射机制2

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

    java反射机制,调用私有方法

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...

    Java反射常用机制

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个特性使得Java代码能够具备高度的动态性,能够在未知类结构的情况下进行操作,增强了程序的灵活性。在Java中...

    java反射和动态代理

    Java 反射机制通过 Reflection API 来实现,主要由以下类来实现: 1. Class 类:代表一个类。 2. Field 类:代表类的成员变量(成员变量也称为类的属性)。 3. Method 类:代表类的方法。 4. Constructor 类:代表...

    java反射机制详解及Method.invoke解释.pdf

    在 Java 反射机制中,除了可以获取对象的属性和调用对象的方法外,还可以生成动态代理。动态代理是指在运行时生成代理类的实例,可以用来拦截和修改对象的方法调用。 Java 反射机制提供了许多强大的功能,可以在...

    Java技术对接收数组参数的成员方法进行反射

    总的来说,理解和掌握如何使用Java反射调用接收数组参数的方法,将有助于提升你在面对复杂编程问题时的灵活性和应变能力。通过实践和不断学习,你可以更熟练地运用反射技术,从而在编程中实现更多可能性。

Global site tag (gtag.js) - Google Analytics