Java SE————反射机制

2021-07-21 15:00:02 浏览数 (1)

反射:

  一. 什么是反射?

          可以在运行时候,动态的查看到类(已经装载到JVM中的Java对象)的所有属性和方法,同时可以访问类的任意方法和属性,这种  方式就称为反射。

先来一个person.class

代码语言:javascript复制
package reflect;

public class Person {
    //类在计算机语言中 描述现实生活中事物的属性特征和行为

    public String name;
    public String sex;
    private int age;

    //构造方法是为了用来创建对象使用的。主要用于初始化。
    //构造方法是和类名相同,参数不同。
    public Person() {
    }
    private Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;

    }

    private void study(){
        System.out.println("我是" name "在学习java");
    }

    private void sleep(){
        System.out.println("我是" name "我要睡觉了");
    }

    @Override
    public String toString() {
        return "reflect.Person{"  
                "name='"   name   '''  
                ", sex='"   sex   '''  
                ", age="   age  
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


}

二.怎么获取类的Class对象

三个方式:

代码语言:javascript复制
import java.lang.reflect.InvocationTargetException;

public class CreateClassObject {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        //加载.class文件,生成Class对象,Class对象的获取方式
       
        //获取Person的Class对象方式一:
        Class clasz = Class.forName("reflect.Person");
        
        //获取Person的Class对象方式二:
        Class clasz1 =Person.class;
        
        //获取Person的Class对象方式三:
        Person person =new Person();
        Class clasz2 =person.getClass();
    }
}

   三.怎么获取类的构造方法

       1.clazz.getContructors()    获取所有的公有构造方法

代码语言:javascript复制
        Class clasz = Class.forName("reflect.Person");
         
        //获取所有公有的构造方法
        
        //返回值类型是一个Constructor型数组
        Constructor[] constructors = clasz.getConstructors();
        for (Constructor cons : constructors) {
            
            //利用toString()打印结果
            System.out.println(cons.toString());
        }

       2.clazz.getContructor()    获取单个公有构造方法

代码语言:javascript复制
  //获取单个公有的无参构造方法
        Constructor constructor = clasz.getConstructor();
        System.out.println(constructor);
        Person person2 = (Person) constructor.newInstance();//调用构造方法创建对象
        person2.setName("hh");
        person2.setSex("男");
        person2.setAge(30);
        person2.study();

       3.clazz.getDeclaredContructors()   获取所有的构造方法(包括公有和私有构造方法)

代码语言:javascript复制
  //获取所有的公有和私有的构造方法
        Constructor[] consts = clasz.getDeclaredConstructors();
        for (Constructor con : consts) {
            System.out.println(con.toString());
        }

    4.  clazz.getDeclaredContructor()    获取单个构造方法(包括公有和私有构造方法)

代码语言:javascript复制
 //获取私有的构造方法
        Constructor constructor1 = clasz.getDeclaredConstructor(String.class); //传入参数
        System.out.println(constructor1);

        constructor1.setAccessible(true);
            //把私有构造方法设置为可访问的
       
        Person person3 = (Person) constructor1.newInstance("hhh");
        person3.study();
  • 调用私有方法时,使用 constructor1.setAccessible(true);可以忽略修饰符。

   四.怎么调用构造方法创建对象

       contructor.newInstance();        contructor.newInstance("参数");

   五.怎么获取成员变量

       clazz.getFields()                     //获取所有的公有属性        clazz.getField()                       //获取单个公有属性        clazz.getDeclaredFields()      //获取所有的属性(包括公有和私有属性)        clazz.getDeclaredField()        //获取单个属性(包括公有和私有属性)

代码语言:javascript复制
package reflect;

import java.lang.reflect.Field;

public class CreateFields {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class clasz = Class.forName("reflect.Person");

        //一、获取类的所有公有成员变量
        Field[] fields = clasz.getFields();
        for (Field field : fields) {
            System.out.println(field.toString());
        }

        /*运行结果:public java.lang.String reflect.Person.name
                   public java.lang.String reflect.Person.sex*/

        //二、获取单个公有成员变量
        Field name = clasz.getField("name");
        Field sex = clasz.getField("sex");
        //Field age = clasz.getField("age"); //age为私有变量,运行报错
        System.out.println(name);
        System.out.println(sex);
        //System.out.println(age);

        /*运行结果:public java.lang.String reflect.Person.name
        public java.lang.String reflect.Person.sex*/

        //三、获取所有的变量(包括公有和私有的)
        Field[] fieldsq1 = clasz.getDeclaredFields();
        for (Field field : fieldsq1) {
            System.out.println(field.toString());      //私有变量age也会打印
        }
            System.out.printf(fieldsq1[2].toString()); //只打印age变量

        //四、获取单个公有成员变量
        Field name1 = clasz.getDeclaredField("name"); //出入参数指定某个变量
        Field sex1 = clasz.getDeclaredField("sex");
        Field age1 = clasz.getDeclaredField("age");
        System.out.println(name1);
        System.out.println(sex1);
        System.out.println(age1);
    }
}

 六.  怎么获取方法

       clazz.getMethods()                //获取所有的公有方法        clazz.getMethod()                  //获取单个公有方法        clazz.getDeclaredMethods()  //获取所有的方法(包括公有和私有方法)        clazz.getDeclaredMethod()   //获取单个方法(包括公有和私有方法)

代码语言:javascript复制
package reflect;

import java.lang.reflect.Method;

public class CreateMethods {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        Class clasz = Class.forName("reflect.Person");

        //一、获取所有的公有方法
        Method[] methods = clasz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
             /*运行结果:(perseon默认继承Object类)
                        public java.lang.String reflect.Person.toString()
                        public java.lang.String reflect.Person.getName()
                        public void reflect.Person.setName(java.lang.String)
                        public void reflect.Person.setAge(int)
                        public void reflect.Person.study()
                        public void reflect.Person.setSex(java.lang.String)
                        public int reflect.Person.getAge()
                        public java.lang.String reflect.Person.getSex()
                        public final void java.lang.Object.wait() throws java.lang.InterruptedException
                        public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
                        public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
                        public boolean java.lang.Object.equals(java.lang.Object)
                        public native int java.lang.Object.hashCode()
                        public final native java.lang.Class java.lang.Object.getClass()
                        public final native void java.lang.Object.notify()
                        public final native void java.lang.Object.notifyAll()*/

         //二、获取单个公有方法
        Method method =clasz.getMethod("study");
        System.out.println(method);
            /*运行结果:public void reflect.Person.study()*/

        //三、获取所有的公有和私有方法
        Method[] methods2 = clasz.getDeclaredMethods();
        for (Method met : methods2) {
            System.out.println(met);
        }
            /*运行结果:私有方法sleep也获取到了,private void reflect.Person.sleep()*/

        //四、获取单个的私有或者公有方法
        Method studyMethod =clasz.getDeclaredMethod("study");
        Method sleepMethod =clasz.getDeclaredMethod("sleep");
        Method getAgeMethod =clasz.getDeclaredMethod("getAge");
        System.out.println(studyMethod);
        System.out.println(sleepMethod);
        System.out.println(getAgeMethod);
       
        /*运行结果: public void reflect.Person.study()
                    private void reflect.Person.sleep()
                    public int reflect.Person.getAge()*/
    }
}

0 人点赞