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)+"、");
	}
}

猜你喜欢

转载自1017401036.iteye.com/blog/2343714