以Person类为例,代码如下:
package Reflection;
public class Person {
public long num;
private String name;
private int age;
private boolean married;
private char sex;
private double salary; public Person() {
} public Person(String name) {
this.name = name;
} public void Show() {
System.out.println("public的show方法:" + name + "工号:" + num +" "+ age + "岁,"
+ "性别:" + sex + " 是否已婚:" + married + "月薪:" + salary);
} private void PShow() {
System.out.println("private的show方法:" + name + "工号:" + num +" "+ age + "岁,"
+ "性别" + sex + " 是否已婚:" + married + "月薪:" + salary);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public boolean isMarried() {
return married;
} public void setMarried(boolean married) {
this.married = married;
} public char getSex() {
return sex;
} public void setSex(char sex) {
this.sex = sex;
} public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
}}
-------------
test 类,代码
package Reflection;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class testPerson {
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException, NoSuchMethodException, InvocationTargetException {
//创建一个Person对象
Person p=new Person();
// 创建Class的对象
Class cla = Person.class;
//String(引用类型)的Set使用
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field namefield = cla.getDeclaredField("name");
// 设置通过反射访问该Field时取消检查
namefield.setAccessible(true);
// 调用set方法为p对象的指定Field设置值
namefield.set(p, "JACK");
//基本类型的Set使用 Long
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field numfield = cla.getDeclaredField("num");
// 不需要通过反射访问该Field时取消检查,因为类型是Public
// namefield.setAccessible(true);//
// 调用set方法为p对象的指定Field设置值
numfield.setLong(p, 101);
System.out.println(numfield.getLong(p));
//基本类型的Set使用Int
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field agefield = cla.getDeclaredField("age");
// 设置通过反射访问该Field时取消检查
agefield.setAccessible(true);
// 调用set方法为p对象的指定Field设置值
agefield.setInt(p, 25);
System.out.println(agefield.getInt(p));
//基本类型的Set使用Boolean
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field marriedfield = cla.getDeclaredField("married");
// 设置通过反射访问该Field时取消检查
marriedfield.setAccessible(true);
// 调用set方法为p对象的指定Field设置值
marriedfield.setBoolean(p, true);
System.out.println(marriedfield.getBoolean(p));
//基本类型的Set使用Char
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field sexfield = cla.getDeclaredField("sex");
// 设置通过反射访问该Field时取消检查
sexfield.setAccessible(true);
// 调用set方法为p对象的指定Field设置值
sexfield.setChar(p, '男');
System.out.println(sexfield.getChar(p));
//基本类型的Set使用Double
// 获取Person类的NAME属性,使用getDeclaredField()方法,表明可获取各种访问级别的属性
Field saltfield = cla.getDeclaredField("salary");
// 设置通过反射访问该Field时取消检查
saltfield.setAccessible(true);
// 调用set方法为p对象的指定Field设置值
saltfield.setDouble(p, 6500);
System.out.println(saltfield.getDouble(p));
//获取指定公共方法
Method method=cla.getMethod("Show", null);
//使用invoke调用方法
Object o=method.invoke(p, null); //获取指定私有方法
Method pri_method=cla.getDeclaredMethod("PShow", null);
// 设置通过反射访问该Field时取消检查
pri_method.setAccessible(true);
//使用invoke调用方法
Object pri_o=pri_method.invoke(p, null);
//使用Array创建数组
//创建数组实例,创建长度为5的存储String类型的数组
Object arr=Array.newInstance(String.class, 5);
Array.set(arr, 0, "Tom");
Array.set(arr, 1, "Jack");
Array.set(arr, 2, "Rose");
Array.set(arr, 3, "Mike");
Array.set(arr, 4, "HanMM");
System.out.println("一维数组");
for(int i=0;i<Array.getLength(arr);i++){//通过Array.getLenth(数组)获取目标数组的长度
System.out.println(Array.get(arr, i));
}
//使用Array创建二维数组
//创建数组实例,创建长度为5的存储String类型的数组
Object er_arr=Array.newInstance(String.class, 5,5);
//获取下标为0的er_arr的一维数组
Object arr2 = Array.get(er_arr, 0);
//给数组赋值意思是给er_arr[0]的[01234]进行分别赋值
Array.set(arr2, 0, "TOM");
Array.set(arr2, 1, "Jack");
Array.set(arr2, 2, "Rose");
Array.set(arr2, 3, "Mike");
Array.set(arr2, 4, "HanMM");
//将arr数组转换为String二维数组进行输出二维数组
String[][] arrstr=(String[][]) er_arr;
for(int i=0;i<arrstr[0].length;i++){//通过Array.getLenth(数组)获取目标数组的长度
System.out.println(arrstr[0][i]);
}
}
}
--------------
总结:
1.通常情况下在使用已知类时不使用反射机制,因为反射的性能略低
2.使用反射的步骤是:
创建class类的对象
实例化类的对象
通过Constructor,Method,Field等来获取指定方法或域
通过field.setXxx来设置域,如果为引用类型则不需要输入Xxx
通过method.invoke来执行方法
3.动态创建一维数组步骤:
创建数组对象的实例,Object arr=Array.newInstance(String.class,5);//储存String的长度为5的数组
添加元素,Array.set(arr,0,"Tom");
输出数组String[] arrstr=(String[])arr;
4.动态创建二维数组步骤:
创建数组对象的实例,Object arr=Array.newInstance(String.class,5,5);//储存String的长度为[5][5]的二维数组
将二维数组转化为一维数组进行操作,Objet arr2=Array.get(arr,0);//代表arr2为arr[0][x]的一维数组
添加元素,Array.set(arr2,0,"Tom");//添加Tom到arr[0][0]的位置上
输出数组String[][] arrstr=(String[][])arr;
arrstr[0][0]结果为Tom