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