反射的定义
反射是在java程序运行时,还能动态的得到某个对象的所有属性和方法信息。并且可以动态执行某个对象的指定方法,或修改指定属性。这就是反射。
简单的反射使用
public class Person implements Serializable{
private static final long serialVersionUID = -5293639382415756109L;
public int pid;
private String pname;
public Person() {
}
public Person(String name) {
this.pname = name;
}
public Person(int pid, String pname) {
this.pid = pid;
this.pname = pname;
}
public String getPname() {
return pname;
}
//getPid是一个私有的方法
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public void setPname(String pname) {
this.pname = pname;
}
//add是一个私有的方法
private String add(Integer i, Integer j) {
return i + j + "";
}
}
这是一个简单的测试类,下面是反射获得的
Class c = Person.class;
(2)对象名.getClass()
Person person = new Person();
Class c2 = person.getClass();
(3)Class.forName("全限定名")
// 全限定名 一定是包含包名的 包名.类名
Class c3 = Class.forName("com.temp.Person");
(4)类.getClassLoader().loadClass("全限定名")
Class c4 = Person.class.getClassLoader().loadClass("com.temp.Person");
(5)子类.class.getSuperClass()
// 父类class对象 (这返回的是Object的Class对象)
Class c5 = Person.class.getSuperclass();
// (6)包装类.class
Class c6 = Integer.class;
获得到的主要内容
根据对应类的Class对象得到全限定名、类名、包名
Class c1 = Class.forName(“com.temp.Person”);
System.out.println(“全限定名” + c1.getName());
System.out.println(“类名” + c1.getSimpleName());
System.out.println(“包名” + c1.getPackage());
获取类的方法 (Method 类)
Class c1 = Person.class;
Object object = c1.newInstance();
// getMethod(方法名,参数数据类型(无参数传Null)) 获取公共方法
Method setPid = c1.getMethod("setPid", int.class);
// invok (对象名, 参数列表)=对象名.方法名 执行方法
setPid.invoke(object, 1);
Method getPid = c1.getMethod("getPid", null);
System.out.println("执行公共getPid返回结果:" + getPid.invoke(object, null));
// getDeclaredMethod(方法名,参数数据类型(无参数传null)) 获取私有方法
Method add = c1.getDeclaredMethod("add", Integer.class, Integer.class);
add.setAccessible(true);
System.out.println("执行私有add返回结果:" + add.invoke(object, 1, 2));
// getReturnType() 得到返回值方法的数据类型的Class对象
Class re = add.getReturnType();
System.out.println("add方法的返回类型"+re.getName());
// getParameterTypes() 得到方法参数列表()
Class[] cal = add.getParameterTypes();
for (Class cc : cal) {
System.out.println(cc.getName());
}
System.out.println("----遍历add的参数列表------结束");
// getDeclaredMethods() 得到类的所有方法
Method[] methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}