前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java SE————反射机制

Java SE————反射机制

作者头像
Java架构师必看
发布2021-07-21 15:00:02
2840
发布2021-07-21 15:00:02
举报
文章被收录于专栏:Java架构师必看

反射:

  一. 什么是反射?

          可以在运行时候,动态的查看到类(已经装载到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()*/
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反射:
    •   一. 什么是反射?
      • 二.怎么获取类的Class对象
        •    三.怎么获取类的构造方法
          •        1.clazz.getContructors()    获取所有的公有构造方法
          •        2.clazz.getContructor()    获取单个公有构造方法
          •        3.clazz.getDeclaredContructors()   获取所有的构造方法(包括公有和私有构造方法)
          •     4.  clazz.getDeclaredContructor()    获取单个构造方法(包括公有和私有构造方法)
        •    四.怎么调用构造方法创建对象
          •    五.怎么获取成员变量
            •  六.  怎么获取方法
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档