用到的实例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)+"、"); } }