美文网首页
Java基础之反射

Java基础之反射

作者: HeloWxl | 来源:发表于2020-03-15 11:04 被阅读0次

1、什么是Java反射?

Java反射就是在Java程序运行时,可以加载、探知、使用编译期间完全为未知的类。也就是说,Java程序可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化初对象,给对象属性设定值或者调用对象的方法。

  • 先看一个简单的Demo
package com.ustcinfo.wangxianlin.reflection;
public class Cat {
    /**
     * 名字
    */
    public String name;
    /**
     * 颜色
     */
    private String color;
    /**
     * 品种
     */
    String type;

    /**
     * 无参构造方法
     */
    public Cat() {
    }

    /**
     * 有参构造方法
     */
    public Cat(String name, String color, String type) {
        this.name = name;
        this.color = color;
        this.type = type;
    }
    /**
     * 有参构造方法
     */
    public Cat(String name) {
        this.name = name;
    }

    /**
    * @Description:  吃饭
    * @params: []
    * @return: void
    */
    public void eat(){
        System.out.println("吃饭");
    }

    /**
     * @Description:  睡觉
     * @params: []
     * @return: void
     */
    private void sleep(){
        System.out.println("睡觉");
    }

    /**
     * getter setter方法
     */
}
  • 通过反射获取Cat类中的方法
package com.ustcinfo.wangxianlin.reflection;

import java.lang.reflect.Method;

public class Reflections {

    public static void main(String[] args) {

        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Method method[] = c.getDeclaredMethods();
            System.out.println("该类的方法有:");
            for (int i = 0 ;i <method.length;i++){
                System.out.println(method[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这里的运行运行结果是将

  • 运行结果


    image.png

2、Class类

2.1获取Class类的方法

  • Class.forName()
Class.forName("java.lang.Object")
  • 类名.class
Class c = Cat.class
  • 包装类.TYPE
Class c = Integer.TYPE
  • 对象名.getClass()
String name = "美短"
Class c = name.getClass()
  • Class类.getSuperClass()
Class c = String.class.getSuperClass()

2.2 Class类常用方法

2.2.1 Filed[] getFileds()

返回一个包含Filed对象的数组,存放该类或接口的所有可访问公共属性(包含继承的公共属性)

public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Field[] fields = c.getFields();
            System.out.println("公共属性数量:"+fields.length);
            System.out.println("分别是:");
            for (int i = 0 ;i <fields.length;i++){
                System.out.println(fields[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

运行结果:


image.png

2.2.2 Filed[] getDeclaredFields()

返回一个包含Filed对象的数组,存放该类或接口的所有属性(不含继承的属性)

public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Field[] fields = c.getDeclaredFields();
            System.out.println("所有属性属性数量:"+fields.length);
            System.out.println("分别是:");
            for (int i = 0 ;i <fields.length;i++){
                System.out.println(fields[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

运行结果:


image.png

2.2.3 Filed[] getFiled()

返回一个指定公共属性名的Filed对象

   public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Field name = c.getField("name");
            System.out.println(name.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

运行结果:


image.png

2.2.4 Method[] getMethods()

  • 返回一个包含Method对象的数组,存放该类或接口的所有可访问公共方法(含继承的公共方法)
 public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
             Method[] methods = c.getMethods();
            System.out.println("所有可访问公共方法的数量:");
            System.out.println("分别是:");
            for(int i = 0;i<methods.length;i++){
                System.out.println(methods[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

运行结果:


image.png

2.2.5 Method[] getDeclaredMethods()

  • 返回一个包含Method对象的数组,存放该类或接口的所有方法(不包含继承的方法)
public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
             Method[] methods = c.getDeclaredMethods();
            System.out.println("所有方法的数量:"+methods.length);
            System.out.println("分别是:");
            for(int i = 0;i<methods.length;i++){
                System.out.println(methods[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

运行结果:


img.png

2.2.6 Constructor[] getConstructors()

  • 返回一个包含Constructor对象的数组,存放该类的所有公共构造方法.
 public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Constructor[] constructor = c.getConstructors();
            System.out.println("所有公共构造方法的数量:"+constructor.length);
            System.out.println("分别是:");
            for(int i = 0;i<constructor.length;i++){
                System.out.println(constructor[i].toString());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
  • 运行结果:


    image.png

2.2.7 Class[] getInterfaces()

  • 返回一个包含Class对象的数组,存放该类或接口实现的接口.
    为了验证测试,Cat我实现了一个接口。
public class Cat implements Readable
public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Class[] c1 = c.getInterfaces();
            for (Class cl:c1
                 ) {
                System.out.println(cl.getName());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

  • 运行结果:


    image.png

2.2.8 T newInterfaces()

  • 使用无参构造方法创建一个该类的新实例.
    为了验证,我在Cat类中,重写了toString方法。
 @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
public static void main(String[] args) {
        try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            Cat cat = (Cat) c.newInstance();
            cat.setColor("黑色");
            cat.setName("小花");
            cat.setType("美短");
            System.out.println(cat.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
  • 运行结果:


    运行结果

2.2.9 String getName()

以String的形式返回该类(类、接口、数组类、基本类型或void)的完整名.

try {
            Class c = Class.forName("com.ustcinfo.wangxianlin.reflection.Cat");
            System.out.println(c.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
image.png

推荐阅读

高级特性-反射

相关文章

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射

    Java基础之—反射(非常重要)

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础之java反射

    什么是反射简单地说,反射就是在JVM运行期间,通过类名,就可以拿到类的所有信息,如变量,方法等 Class该类位于...

  • Java基础之—反射

    一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象...

  • java基础之反射

    反射概述 JAVA反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法; 对于任意一个对象,都能...

  • Java基础之—反射

    1)类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进...

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • JAVA基础之反射

    1.认识反射 利用对象找到对象的出处,在object中类有一个方法叫做getClass(); 2.反射机制 cla...

网友评论

      本文标题:Java基础之反射

      本文链接:https://www.haomeiwen.com/subject/xvfashtx.html