Field类的对象

目录

1、对于成员变量的调用:

①public的成员变量

②非public的成员

二、对于方法的调用

①无参方法调用:

②有参方法调用:

三、获取加载类中的成员变量数组

①getFields()——获取public的成员变量

②getDeclaredFields()——获取所有的成员变量

四、获取所有加载类中方法的数组

①getMethods()——获取所有加载类及父类方法

②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 +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值