目录
②getDeclaredFields()——获取所有的成员变量
②getDeclaredMethods()——获取所有当前加载类的方法
③Constructor类————b表示加载类中的构造方法对象
当一个加载类被加载的时候,反射对象可以获取加载类中的成员变量和方法,每一个成员变量实际上都是一个Field类的对象,每一个方法实际上都是一个Method类的对象,这些对象都是系统自动创建的
1、对于成员变量的调用:
①public的成员变量
对于一个public的成员变量,我们只需要使用反射对象调用getField(成员变量名)就可以得到它的Field类对象,我们通过Field类对象调用set方法传入加载类对象和成员变量值来完成对加载类的赋值
Field类的函数调用:
定义 Field f =null;
public修饰的成员变量名:
对象名=实例.getField("成员变量名");
对象名.set(实例名,"成员变量值");//赋值
package com.iweb.test;
import java.lang.reflect.Field;
public class Test2 {
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException, InstantiationException {
Class<Student> c1=Student.class;
Student s2= null;
s2 = c1.newInstance();
Field f1= null;
f1 = c1.getField("sno");
f1.set(s2,"1002");
System.out.println(s2);
}
}
②非public的成员
对于非public的成员,我们需要使用反射对象调用getDeclaredField(成员变量名)得到对应的Field对象,然后通过setAccess(true)进行授权才可以使用
package com.iweb.test;
import java.lang.reflect.Field;
public class Test3 {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Class<Student>c1=Student.class;
Student s2=new Student();
Field f2=c1.getDeclaredField("sname");
f2.setAccessible(true);
f2.set(s2,"张三");
System.out.println(s2);
}
}
二、对于方法的调用
对于方法:我们可以通过反射对象.getMethod(方法名)得到加载类的方法的Method对象,然后由该Method对象调用invoke(加载类对象)完成方法调用
①无参方法调用:
Method m1 =c1.getMethod("info");
m1.invoke(s2);
public static void info(){
System.out.println("我是一个学生");
}
②有参方法调用:
如果是有参的方法,那么getMethod(方法名)还要传入参数的Class对象,调用的使用invoke方法还要传入参数值
Method m2=c1.getMethod("display", String.class);
m2.invoke(s2,"好");
public static void display (String s){
System.out.println("我是一个"+s+"学生");
}
三、获取加载类中的成员变量数组
①getFields()——获取public的成员变量
Class<Student> c1 = Student.class;
Field[] fields = c1.getFields();
System.out.println(fields.length);
for (Field f : fields)
{
System.out.println(f);
}
②getDeclaredFields()——获取所有的成员变量
Class<Student> c1 = Student.class;
Field[] fields2 = c1.getDeclaredFields();
System.out.println(fields2.length);
for (Field f : fields2)
{
System.out.println(f);
}
四、获取所有加载类中方法的数组
①getMethods()——获取所有加载类及父类方法
Class<Student> c1 = Student.class;
Method[] methods =c1.getMethods();
System.out.println(methods.length);
for(Method m:methods)
{
System.out.println(m);
}
②getDeclaredMethods()——获取所有当前加载类的方法
Class<Student> c1 = Student.class;
Method[] methods2 =c1.getDeclaredMethods();
System.out.println(methods2.length);
for(Method m:methods2)
{
System.out.println(m);
}
③Constructor类————b表示加载类中的构造方法对象
我们通过getDeclaredConstructors()来获取加载类构造方法数组
Constructor[] constructors =c1.getConstructors();
System.out.println(constructors.length);
for(Constructor c:constructors){
System.out.println(c);}
Constructor<Student> c =c1.getDeclaredConstructor(String.class,String.class,int.class);
Student s3= c.newInstance("1003","李四",20);
Student类:
package com.iweb.test;
public class Student {
// public String name;
public String sno;
private String name;
private int age;
public static void info(){
System.out.println("我是一个学生");
}
public static void display (String s){
System.out.println("我是一个"+s+"学生");
}
public Student(String sno, String name, int age) {
this.sno = sno;
this.name = name;
this.age = age;
}
public Student() {
System.out.println("我是无参的构造方法");
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
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;
}
@Override
public String toString() {
return "Student{" +
"sno='" + sno + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}