使用java反射机制,获取已存在类的信息
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
代码示例
1.首先构建Students类
package com.whtcc.person;
public class Students {
private String stu_name;
private int stu_age;
public Students() {
super();
// TODO Auto-generated constructor stub
}
public Students(String stu_name, int stu_age) {
super();
this.stu_name = stu_name;
this.stu_age = stu_age;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getStu_age() {
return stu_age;
}
public void setStu_age(int stu_age) {
this.stu_age = stu_age;
}
public void study(int a,int b) {
System.out.println("学生正在学习。。。计算a+b=="+(a+b));
}
}
2.创建测试类
package com.whtcc.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import com.whtcc.person.Students;
public class Main {
public static void main(String[] args) {
try {
//通过反射获得Students对象
Class<?> stuClass=Class.forName("com.whtcc.person.Students");
Students stu2=(Students) stuClass.newInstance();
//测试是否能调用Students类的study方法
stu2.study(3,2);
//获取name_field属性对象
Field name_field=stuClass.getDeclaredField("stu_name");
//设置name_field属性对象取消权限检查
name_field.setAccessible(true);
//创建Students对象stu1
Students stu1=new Students("Mary",15);
//打印stu1的name属性值
String namestr=(String)name_field.get(stu1);
System.out.println("stu1的name=="+namestr.toString());
//修改stu1的name属性值为jike,并输出至控制台
name_field.set(stu1, "jike");
String newnamestr=(String)name_field.get(stu1);
System.out.println("stu1的新name=="+newnamestr.toString());
//获取age_field属性对象及相关操作
Field age_field=stuClass.getDeclaredField("stu_age");
age_field.setAccessible(true);
System.out.println("stu1对象的age值=="+age_field.getInt(stu1));
//获取age_field属性修饰符类型
int modifier=age_field.getModifiers();
System.out.println("stu1对象的age值修饰符=="+Modifier.toString(modifier));
//获取age_field属性名称
System.out.println("stu1对象的age值属性名称=="+age_field.getName());
System.out.println("-----------------------------------------------------------");
/*
* *通过反射获取并调用对象的方法(以study方法为例)
*/
Method method=stuClass.getMethod("study",int.class,int.class);
//获取study方法的修饰符
System.out.println("study方法的权限修饰符是"+Modifier.toString(method.getModifiers()));
//获取study方法的返回值类型
System.out.println("study方法的返回值类型是"+method.getReturnType().getName());
//获取study方法的参数列表
Class<?>[] parameterTypes=method.getParameterTypes();
System.out.println("参数列表="+Arrays.toString(parameterTypes));
//调用study方法
method.invoke(stu1, 6,5);
//更改stu1对象的属性
Method setnameMethod = stuClass.getDeclaredMethod("setStu_name", String.class);//第一个参数是方法名称,第二个参数是方法参数类型的类类型
setnameMethod.invoke(stu1, "tony");
System.out.println("stu1的新名字是"+stu1.getStu_name());
/*
* 拓展:使用反射调用ArrayList类的方法
*/
Class<?> cla=Class.forName("java.util.ArrayList");
Method method2=cla.getMethod("add", Object.class);
ArrayList<String> alt=(ArrayList<String>) cla.newInstance();
method2.invoke(alt, "we are family");
System.out.println(alt);
//通过反射获取构造器对象
Constructor<?> constructors=stuClass.getConstructor();
Constructor<?> constructors1=stuClass.getConstructor(String.class,int.class);
Students s1=(Students) constructors.newInstance();
Students s2=(Students) constructors1.newInstance("fa",19);
} catch (Exception e) {
e.printStackTrace();
}
}
}